Enviar um nó inteiro por email (incluindo o conteúdo do modelo)

9

Eu criei meu próprio arquivo node.tpl.php personalizado. Agora, quero enviar um email para todo o nó, sempre que o usuário criar um novo nó desse tipo de conteúdo (verifiquei que todo o HTML no meu arquivo node.tpl.php é compatível com email).

Como posso fazer isso? Idealmente, gostaria que o email fosse automaticamente para um endereço de email específico quando o nó fosse salvo.

Eu descobri que uma combinação de regras e correio HTML pode alcançar o que eu quero. Exceto ... Ao criar uma ação de regra, não há a opção de enviar um email para o nó inteiro (incluindo o tema node.tpl.php). Regras apenas oferece a opção de enviar por email campos específicos de nós (sem temas).

Todas as sugestões seriam muito apreciadas!

grande sorriso
fonte

Respostas:

20

Aqui está outra abordagem. (O código está disponível nesta sandbox .)

nodemail.info

name = Nodemail
description = Sends node e-mails.
core = 7.x

nodemail.install '

<?php
function nodemail_enable() {
  $current = variable_get('mail_system', array('default-system' => 'DefaultMailSystem'));
  $addition = array('nodemail' => 'NodemailMailSystem');
  variable_set('mail_system', array_merge($current, $addition));
}

function nodemail_disable() {
  $mail_system = variable_get('mail_system', array('default-system' => 'DefaultMailSystem'));
  unset($mail_system['nodemail']);
  variable_set('mail_system', $mail_system);
}

nodemail.module

<?php
class NodemailMailSystem extends DefaultMailSystem {
  public function format(array $message) {
    $message['body'] = implode("\n\n", $message['body']);
    $message['body'] = drupal_wrap_mail($message['body']);
    return $message;
  }
}

function nodemail_mail($key, &$message, $params) {
  switch ($key) {
    case 'node_mail':
      $message['headers']['Content-Type'] = 'text/html; charset=UTF-8;';
      $message['subject'] = $params['subject'];
      $message['body'][] = $params['body'];
      break;
  }
}

function nodemail_node_insert($node) {
  if ($node->type == 'mycontenttype') {
    $params['subject'] = 'Node "' . $node->title . '" was created';
    $params['body'] = render(node_view($node));
    $to = variable_get('site_mail', '');
    $from = '[email protected]';
    $lang = language_default();
    drupal_mail('nodemail', 'node_mail', $to, $lang, $params, $from);
  }
}

O conteúdo do arquivo de instalação e a classe NodemailMailSystem são usados ​​para permitir que este módulo envie emails em HTML. As outras 2 funções são implementações de hook_mail () e hook_node_insert () que lidam com o envio de emails quando um nó de mycontenttypeé criado. Uma coisa que você deve observar é que o Drupal usará o arquivo de modelo de nó do tema que está sendo usado para as páginas de criação de nós (ou o core node.tpl.php, se o tema não o possuir) para a visualização do nó . Você também pode verificar as funções node_view () e drupal_mail () usadas aqui. Tudo isso deve funcionar com a funcionalidade principal do Drupal 7 (nenhum módulo contribuído é necessário).

Madis
fonte
Obrigado! Isso funciona, exceto ... No meu site, o modelo para um nó é alterado de acordo com o termo de taxonomia. Portanto, se o usuário marcar o nó com o termo 1, o modelo 1 será usado para renderizar o nó. (consulte drupal.stackexchange.com/questions/23688/… ). Quando uso seu código, apenas o arquivo node.tpl.php padrão é usado (e não o modelo usado para renderizar o nó). Existe alguma maneira de corrigir isso? (Desculpe se pareço um incômodo por não ter mencionado isso antes - pensei que não seria um problema porque o nó renderizado contém o modelo).
Big_smile 9/03/12
@ big_smile O problema é provavelmente o que mencionei na minha resposta: o tema admin que está sendo usado para a criação de nós. Possíveis correções que consigo pensar atualmente: 1) use seu tema padrão para edição / criação de conteúdo (desmarque a caixa de seleção em 'admin / aparência') 2) copie o código necessário de template.php e os modelos de nó para a pasta de temas admin e limpar caches 3) crie modelos personalizados em seu módulo para os e-mails.
Madis
6

Você pode criar um token que era o nó renderizado ou criar uma ação de Regras customizada que enviará o nó renderizado.

Você quer olhar

$build = node_view($node);
$html = render($build);

Atualizado com código

Este código mostra como adicionar uma propriedade a todos os nós que podem ser acessíveis em regras. Eu criei esse módulo chamadogoogletorp

/**
 * Implements hook_entity_property_info_alter().
 */
function googletorp_entity_property_info_alter(&$info) {
  // Add the current user's shopping cart to the site information.
  $info['node']['properties']['rendered_node'] = array(
    'label' => t("Rendered_node"),
    'description' => t('The full rendered node.'),
    'getter callback' => 'googletorp_render_node',
  );
}

/**
 * Return a rendered node as HTML.
 */
function googletorp_render_node($node) {
  return render(node_view($node));
}

A primeira função é um gancho que adiciona a propriedade ao nó, em que um retorno de chamada é definido para fornecer os dados. A segunda função é o retorno de chamada real que retorna o nó renderizado.

Para que isso funcione, você precisa instalar o módulo de tokens de entidade, que faz parte do módulo API da entidade , mas isso é exigido pelas regras de qualquer maneira.

googletorp
fonte
Obrigado - é exatamente isso que eu preciso. Mas como você faz isso? Fiz o download de Regras e Token, mas não há opções para enviar o nó renderizado.
Big_smile
@big_smile Você precisaria criar essa funcionalidade - existem várias maneiras de fazer isso.
googletorp
Obrigado por reservar um tempo para responder. Para ser honesto, suas respostas não são muito úteis. Se eu soubesse como criar a funcionalidade, não faria uma pergunta. Obviamente, não espero que você publique a resposta completa. No entanto, seria útil se você pudesse fornecer links para recursos que elaboram sobre como realizar as suas sugestões,
big_smile
2
@big_smile Então você me rebaixou porque eu não te dei comida manual? Você já tentou o google, a página inicial do projeto? Encontrei documentos extensos sobre regras em 30 segundos. Tenho certeza de que você pode fazer o mesmo. Não seja preguiçoso.
googletorp
11
Eu não sou preguiçoso e não espero ser alimentado. Sua resposta foi muito vaga e não implica que a resposta possa ser encontrada no documento Regras. De fato, "Você mesmo criaria essa funcionalidade" implica que eu teria que produzir algo que esteja fora das Regras. Foi por isso que eu rebaixei sua resposta - era muito vago para ser útil. No entanto, olhando para o seu perfil, vejo que você é muito útil e, com base nisso, não acho que tenha sido sua intenção ser vaga. Não achei que a votação para baixo fosse muito perturbadora. Eu o reverteria se pudesse. Espero que não haja ressentimentos.
big_smile
1

Outra opção seria usar meu módulo Entity2Text (DRupal 7).

No momento, ele fornece um token "textexport" para todos os modos de exibição de uma entidade. Isso funciona bem para muitos tipos de campos, mas tem alguns problemas mais complexos, como o campo de endereço.

Também vou adicionar "htmlexport". Se você quiser experimentar isso, confira este ramo: http://drupalcode.org/project/entity2text.git/shortlog/refs/heads/7.x-1-htmlexport

Você ainda teria que usar o Rules e o MimeMail (ou provavelmente o htmlmail mencionado acima).

tedbow
fonte