Invia per e-mail un intero nodo (incluso il contenuto del modello)


9

Ho creato il mio file node.tpl.php personalizzato. Ora voglio inviare per e-mail l'intero nodo, ogni volta che l'utente crea un nuovo nodo di quel tipo di contenuto (mi sono assicurato che tutto l'HTML nel mio file node.tpl.php sia compatibile con la posta elettronica).

Come posso fare questo? Idealmente vorrei che l'e-mail passasse automaticamente a un indirizzo e-mail specifico quando il nodo veniva salvato.

Ho scoperto che una combinazione di regole e posta HTML può ottenere ciò che voglio. Tranne ... Quando si crea un'azione per la regola, non è possibile inviare tramite e-mail l'intero nodo (incluso il tema node.tpl.php). Le regole offrono solo la possibilità di inviare tramite e-mail specifici campi nodo (senza tema).

Qualunque suggerimento è ben accetto!

Risposte:


20

Ecco un altro approccio. (Il codice è disponibile in questo 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 = 'noreply@example.com';
    $lang = language_default();
    drupal_mail('nodemail', 'node_mail', $to, $lang, $params, $from);
  }
}

Il contenuto del file di installazione e la classe NodemailMailSystem vengono utilizzati per consentire a questo modulo di inviare e-mail html. Le altre 2 funzioni sono implementazioni di hook_mail () e hook_node_insert () che si occupano dell'invio delle e-mail quando mycontenttypeviene creato un nodo di . Una cosa che dovrai notare è che Drupal utilizzerà il file modello nodo del tema che viene utilizzato per le pagine di creazione del nodo (o il nodo principale.tpl.php se il tema non lo ha) per la vista nodo . Potresti anche voler controllare le funzioni node_view () e drupal_mail () che sono utilizzate qui. Tutto questo dovrebbe funzionare con le funzionalità principali di Drupal 7 (non sono necessari moduli contribuiti).


Grazie! Funziona tranne ... Sul mio sito, il modello per un nodo cambia in base al termine tassonomia. Pertanto, se l'utente contrassegna il nodo con il termine 1, il modello 1 viene utilizzato per eseguire il rendering del nodo. (vedi drupal.stackexchange.com/questions/23688/… ). Quando uso il tuo codice, viene utilizzato solo il file node.tpl.php predefinito (e non il modello utilizzato per il rendering del nodo). Esiste un modo per risolvere questo problema? (Scusate se sembro una seccatura per non averlo menzionato prima - pensavo che non sarebbe stato un problema perché il nodo renderizzato contiene il modello).
big_smile

@big_smile Il problema è probabilmente quello che ho menzionato nella mia risposta: il tema dell'amministratore che viene utilizzato per la creazione del nodo. Possibili correzioni a cui posso pensare attualmente: 1) utilizzare il tema predefinito per la modifica / creazione del contenuto (deselezionare la casella di controllo in "admin / aspetto") 2) copiare il codice necessario da template.php e i modelli di nodo nella cartella del tema di amministrazione e cancella cache 3) crea modelli personalizzati nel tuo modulo per le e-mail.
Madis

6

È possibile creare un token che era il nodo renderizzato o creare un'azione Regole personalizzata che invierà il nodo renderizzato.

Vuoi guardare

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

Aggiornato con il codice

Questo codice mostra come aggiungere una proprietà a tutti i nodi che possono essere resi accessibili nelle regole. Ho creato questo un modulo chiamatogoogletorp

/**
 * 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));
}

La prima funzione è un hook che aggiunge la proprietà al nodo, dove in un callback è definito per fornire i dati. La seconda funzione è il callback effettivo che restituisce il nodo renderizzato.

Affinché ciò funzioni, è necessario installare il modulo token entità che fa parte del modulo API entità , ma ciò è comunque richiesto dalle regole.


Grazie - è esattamente quello di cui ho bisogno. Ma come si fa? Ho scaricato Regole e token, ma non ci sono opzioni per inviare il nodo renderizzato.
big_smile,

@big_smile Dovresti creare questa funzionalità tu stesso - ci sono diversi modi per farlo.
googletorp

Grazie per il tempo dedicato a rispondere. Ad essere onesti, le tue risposte non sono molto utili. Se sapessi come creare la funzionalità da solo, non farei una domanda. Ovviamente, non mi aspetto che pubblichi la risposta completa. Tuttavia, sarebbe utile se potessi fornire link a risorse che elaborano come eseguire i tuoi suggerimenti,
big_smile

2
@big_smile Quindi mi hai votato perché non ti ho dato da mangiare? Hai provato Google, hai provato l'homepage del progetto? Ho trovato numerosi documenti sulle regole in 30 secondi, sono sicuro che puoi fare lo stesso. Non essere pigro.
googletorp

1
Non sono pigro e non mi aspetto di essere nutrito. La tua risposta è stata molto vaga e non implica affatto che la risposta possa essere trovata nel documento Regole. In effetti, "Avresti creato questa funzionalità tu stesso" implica che avrei dovuto produrre qualcosa che è al di fuori delle Regole. Questo è il motivo per cui ho votato in negativo la tua risposta - era troppo vago per essere utile. Tuttavia, guardando il tuo profilo, posso vedere che sei molto utile e in base a questo non penso che la tua intenzione sia stata vaga. Non pensavo che il voto negativo sarebbe stato molto sconvolgente. Lo invertirei se potessi. Spero non ci siano sentimenti duri.
big_smile

1

Un'altra opzione sarebbe utilizzare il mio modulo Entity2Text (DRupal 7).

In questo momento fornisce un token "textexport" per ogni modalità di visualizzazione di un'entità. Funziona bene per molti tipi di campi ma presenta alcuni problemi più complessi come il campo Indirizzo.

Ho anche intenzione di aggiungere "htmlexport". Se vuoi provarlo dai un'occhiata a questo ramo: http://drupalcode.org/project/entity2text.git/shortlog/refs/heads/7.x-1-htmlexport

Dovresti comunque usare Rules e MimeMail (o probabilmente htmlmail sopra menzionato).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.