web-dev-qa-db-fra.com

Envoyer un e-mail entier Node (Y compris le contenu du modèle)

J'ai créé mon propre fichier node.tpl.php personnalisé. Je veux maintenant envoyer un e-mail au nœud entier, chaque fois que l'utilisateur crée un nouveau nœud de ce type de contenu (je me suis assuré que tout le code HTML de mon fichier node.tpl.php est compatible avec les e-mails).

Comment puis-je faire ceci? Idéalement, je voudrais que l'e-mail soit automatiquement envoyé à une adresse e-mail spécifique lorsque le nœud est enregistré.

J'ai trouvé qu'une combinaison de Rules et HTML Mail peut réaliser ce que je veux. Sauf ... Lors de la création d'une action de règle, il n'est pas possible d'envoyer un e-mail à l'ensemble du nœud (y compris le thème node.tpl.php). Les règles ne permettent que d'envoyer des champs de noeud spécifiques par e-mail (sans thème).

Toute suggestion sera très appréciée!

9
big_smile

Voici une autre approche. (Le code est disponible dans ce bac à sable .)

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

Le contenu du fichier d'installation et la classe NodemailMailSystem sont utilisés pour permettre à ce module d'envoyer des e-mails html. Les 2 autres fonctions sont des implémentations de hook_mail () et hook_node_insert () qui traitent de l'envoi des e-mails lorsqu'un nœud de mycontenttype est créé. Une chose que vous devrez noter est que Drupal utilisera le fichier de modèle de nœud du thème qui est utilisé pour les pages de création de nœuds (ou le noyau node.tpl.php si le thème ne fonctionne pas). pour la vue du nœud. Vous pouvez également consulter les fonctions node_view () et drupal_mail () utilisées ici. Tout cela devrait fonctionner avec Drupal 7 fonctionnalités de base (aucun module contribué n'est nécessaire).

20
Madis

Vous pouvez créer un jeton qui était le nœud rendu ou créer une action de règles personnalisée qui enverra le nœud rendu.

Vous voulez regarder

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

Mis à jour avec le code

Ce code montre comment ajouter une propriété à tous les nœuds qui peut être rendue accessible dans les règles. Je l'ai créé un module appelé googletorp

/**
 * 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 première fonction est un hook qui ajoute la propriété au nœud, où dans un rappel est défini pour fournir les données. La deuxième fonction est le rappel réel qui renvoie le nœud rendu.

Pour que cela fonctionne, vous devez installer le module de jetons d'entité qui fait partie du module API d'entité , mais cela est de toute façon requis par les règles.

6
googletorp

Une autre option serait d'utiliser mon module Entity2Text (DRupal 7).

À l'heure actuelle, il donne un jeton "textexport" pour chaque mode d'affichage d'une entité. Cela fonctionne bien pour de nombreux types de champs, mais a des problèmes plus complexes comme le champ d'adresse.

Je vais également ajouter "htmlexport". Si vous voulez essayer cela, consultez cette branche: http://drupalcode.org/project/entity2text.git/shortlog/refs/heads/7.x-1-htmlexport

Vous devrez toujours utiliser les règles et MimeMail (ou probablement htmlmail mentionné ci-dessus).

1
tedbow