Envoyer un nœud entier par courrier électronique (y compris le contenu du modèle)

9

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 constaté qu'une combinaison de règles et de courrier HTML 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!

grand sourire
la source

Réponses:

20

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 mycontenttypeest 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œud (ou le noyau node.tpl.php si le thème ne l'a pas) pour la vue du nœud . Vous pouvez également vouloir vérifier les fonctions node_view () et drupal_mail () qui sont utilisées ici. Tout cela devrait fonctionner avec la fonctionnalité de base de Drupal 7 (aucun module n'a été nécessaire).

Madis
la source
Merci! Cela fonctionne sauf… Sur mon site, le modèle d'un nœud change en fonction du terme de taxonomie. Donc, si l'utilisateur marque le nœud avec le terme 1, le modèle 1 est utilisé pour rendre le nœud. (voir drupal.stackexchange.com/questions/23688/… ). Lorsque j'utilise votre code, seul le fichier node.tpl.php par défaut est utilisé (et non le modèle utilisé pour rendre le nœud). Est-ce qu'il y a un moyen de réparer ceci? (Désolé si je semble gênant de ne pas l'avoir mentionné plus tôt - je pensais que ce ne serait pas un problème car le nœud rendu contient le modèle).
big_smile
@big_smile Le problème est probablement ce que j'ai mentionné dans ma réponse: le thème d'administration utilisé pour la création de nœuds. Corrections possibles auxquelles je peux penser actuellement: 1) utiliser votre thème par défaut pour l'édition / création de contenu (décochez la case dans 'admin / apparence') 2) copiez le code nécessaire depuis template.php et les modèles de noeud dans le dossier de thème admin et effacer les caches 3) créer des modèles personnalisés dans votre module pour les e-mails.
Madis
6

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. J'ai créé ce 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.

googletorp
la source
Merci - c'est exactement ce dont j'ai besoin. Mais comment fais-tu cela? J'ai téléchargé Rules and Token, mais il n'y a pas d'options pour envoyer le noeud rendu.
big_smile
@big_smile Vous devez créer cette fonctionnalité vous-même - il existe plusieurs façons de procéder.
googletorp
Merci de prendre le temps de répondre. Pour être honnête, vos réponses ne sont pas très utiles. Si je savais comment créer la fonctionnalité moi-même, je ne poserais pas de question. Évidemment, je ne m'attends pas à ce que vous publiez la réponse complète. Cependant, il serait utile de fournir des liens vers des ressources qui expliquent comment exécuter vos suggestions,
big_smile
2
@big_smile Alors, vous me votez parce que je ne vous ai pas nourri à la main? Avez-vous essayé Google, avez-vous essayé la page d'accueil du projet? J'ai trouvé de nombreux documents sur les règles en 30 secondes, je suis sûr que vous pouvez faire de même. Ne sois pas paresseux.
googletorp
1
Je ne suis pas paresseux et je ne m'attends pas à être nourri. Votre réponse était très vague et n'implique nullement que la réponse se trouve dans le document Rules. En fait, «vous auriez créé cette fonctionnalité vous-même» implique que je devrais produire quelque chose qui est en dehors des règles. C'est pourquoi j'ai rétrogradé votre réponse - elle était trop vague pour être utile. Cependant, en regardant votre profil, je peux voir que vous êtes très utile et sur cette base, je ne pense pas que votre intention était d'être vague. Je ne pensais pas que le vote à la baisse serait très bouleversant. Je l'inverserais si je le pouvais. J'espère qu'il n'y a pas de rancune.
big_smile
1

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 Rules et MimeMail (ou probablement htmlmail mentionné ci-dessus).

arc-en-ciel
la source