E-Mail an einen ganzen Knoten senden (einschließlich Vorlageninhalt)

9

Ich habe meine eigene benutzerdefinierte Datei node.tpl.php erstellt. Ich möchte jetzt den gesamten Knoten per E-Mail versenden, jedes Mal, wenn der Benutzer einen neuen Knoten dieses Inhaltstyps erstellt (ich habe sichergestellt, dass der gesamte HTML-Code in meiner Datei node.tpl.php E-Mail-freundlich ist).

Wie kann ich das machen? Idealerweise möchte ich, dass die E-Mail automatisch an eine bestimmte E-Mail-Adresse gesendet wird, wenn der Knoten gespeichert wird.

Ich habe festgestellt, dass eine Kombination aus Regeln und HTML-Mail das erreichen kann, was ich will. Außer ... Beim Erstellen einer Regelaktion besteht nicht die Möglichkeit, den gesamten Knoten per E-Mail zu versenden (einschließlich des Themas node.tpl.php). Regeln bieten nur die Möglichkeit, bestimmte Knotenfelder per E-Mail zu versenden (ohne Themen).

Anregungen wäre sehr dankbar!

big_smile
quelle

Antworten:

20

Hier ist ein anderer Ansatz. (Der Code ist in dieser Sandbox verfügbar .)

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

Der Inhalt der Installationsdatei und die NodemailMailSystem-Klasse werden verwendet, damit dieses Modul HTML-E-Mails senden kann. Die beiden anderen Funktionen sind Implementierungen von hook_mail () und hook_node_insert () , die sich mit dem Senden der E-Mails befassen, wenn ein Knoten von mycontenttypeerstellt wird. Eine Sache, die Sie beachten müssen, ist, dass Drupal die Knotenvorlagendatei des Themas verwendet, das für die Knotenerstellungsseiten verwendet wird (oder die Kernknoten.tpl.php, wenn das Thema keine hat) für die Knotenansicht . Möglicherweise möchten Sie auch die hier verwendeten Funktionen node_view () und drupal_mail () überprüfen . Diese ganze Sache sollte mit der Drupal 7-Kernfunktionalität funktionieren (es werden keine bereitgestellten Module benötigt).

Madis
quelle
Vielen Dank! Das funktioniert außer ... Auf meiner Site ändert sich die Vorlage für einen Knoten entsprechend dem Taxonomiebegriff. Wenn der Benutzer den Knoten mit Term 1 markiert, wird Vorlage 1 zum Rendern des Knotens verwendet. (Siehe drupal.stackexchange.com/questions/23688/… ). Wenn ich Ihren Code verwende, wird nur die Standarddatei node.tpl.php verwendet (und nicht die Vorlage, die zum Rendern des Knotens verwendet wird). Gibt es eine Möglichkeit, dies zu beheben? (Entschuldigung, wenn ich ein Ärgernis dafür bin, dass ich dies nicht früher erwähnt habe - ich dachte, es wäre kein Problem, da der gerenderte Knoten die Vorlage enthält).
big_smile
@big_smile Das Problem ist wahrscheinlich das, was ich in meiner Antwort erwähnt habe: das Admin-Thema, das für die Knotenerstellung verwendet wird. Mögliche Korrekturen, an die ich derzeit denken kann: 1) Verwenden Sie Ihr Standardthema für die Bearbeitung / Erstellung von Inhalten (deaktivieren Sie das Kontrollkästchen in 'admin / Erscheinungsbild'). 2) Kopieren Sie den erforderlichen Code aus template.php und den Knotenvorlagen in den Ordner admin theme und Caches löschen 3) Erstellen Sie in Ihrem Modul benutzerdefinierte Vorlagen für die E-Mails.
Madis
6

Sie können ein Token erstellen, das der gerenderte Knoten war, oder eine benutzerdefinierte Regelaktion erstellen, die den gerenderten Knoten sendet.

Du willst schauen

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

Mit Code aktualisiert

Dieser Code zeigt, wie Sie allen Knoten eine Eigenschaft hinzufügen, auf die in Regeln zugegriffen werden kann. Ich habe ein Modul namens erstelltgoogletorp

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

Die erste Funktion ist ein Hook, der die Eigenschaft dem Knoten hinzufügt, in dem in einem Rückruf die Bereitstellung der Daten definiert ist. Die zweite Funktion ist der eigentliche Rückruf, der den gerenderten Knoten zurückgibt.

Damit dies funktioniert, müssen Sie das Entity-Token-Modul installieren, das Teil des Entity-API-Moduls ist. Dies wird jedoch von den Regeln trotzdem verlangt.

googletorp
quelle
Danke - genau das brauche ich. Aber wie machst du das? Ich habe Rules and Token heruntergeladen, aber es gibt keine Optionen zum Senden des gerenderten Knotens.
big_smile
@big_smile Sie müssten diese Funktionalität selbst erstellen - es gibt verschiedene Möglichkeiten, dies zu tun.
googletorp
Vielen Dank, dass Sie sich die Zeit genommen haben, um zu antworten. Um ehrlich zu sein, sind Ihre Antworten nicht sehr hilfreich. Wenn ich wüsste, wie ich die Funktionalität selbst erstellen kann, würde ich keine Frage stellen. Natürlich erwarte ich nicht, dass Sie die vollständige Antwort veröffentlichen. Es wäre jedoch hilfreich, wenn Sie Links zu Ressourcen bereitstellen könnten, die erläutern, wie Ihre Vorschläge ausgeführt werden sollen.
big_smile
2
@big_smile Also hast du mich abgelehnt, weil ich dich nicht von Hand gefüttert habe? Haben Sie Google ausprobiert, haben Sie die Projekthomepage ausprobiert? Ich habe in 30 Sekunden umfangreiche Regel-Dokumente gefunden. Ich bin sicher, Sie können das Gleiche tun. Sei nicht faul.
googletorp
1
Ich bin nicht faul und erwarte nicht, gefüttert zu werden. Ihre Antwort war sehr vage und bedeutet keineswegs, dass die Antwort im Regel-Dokument zu finden ist. Tatsächlich bedeutet "Sie hätten diese Funktionalität selbst erstellt", dass ich etwas produzieren müsste, das außerhalb der Regeln liegt. Deshalb habe ich Ihre Antwort abgelehnt - sie war zu vage, um hilfreich zu sein. Wenn Sie sich jedoch Ihr Profil ansehen, sehen Sie, dass Sie sehr hilfreich sind, und auf dieser Grundlage glaube ich nicht, dass Sie beabsichtigt haben, vage zu sein. Ich hätte nicht gedacht, dass die Abstimmung sehr ärgerlich sein würde. Ich würde es umkehren, wenn ich könnte. Ich hoffe es gibt keine harten Gefühle.
big_smile
1

Eine andere Option wäre die Verwendung meines Moduls Entity2Text (DRupal 7).

Derzeit wird für jeden Ansichtsmodus einer Entität ein "Textexport" -Token ausgegeben. Dies funktioniert gut für viele Feldtypen, hat jedoch einige komplexere Probleme wie das Adressfeld.

Ich werde auch "htmlexport" hinzufügen. Wenn Sie das ausprobieren möchten, schauen Sie sich diesen Zweig an: http://drupalcode.org/project/entity2text.git/shortlog/refs/heads/7.x-1-htmlexport

Sie müssten weiterhin Rules und MimeMail (oder wahrscheinlich die oben erwähnte HTML-Mail) verwenden.

Tedbow
quelle