Wyślij e-mail do całego węzła (w tym zawartość szablonu)


9

Utworzyłem własny niestandardowy plik node.tpl.php. Chcę teraz wysłać wiadomość e-mail do całego węzła za każdym razem, gdy użytkownik utworzy nowy węzeł tego typu treści (upewniłem się, że cały kod HTML w moim pliku node.tpl.php jest przyjazny dla poczty e-mail).

W jaki sposób mogę to zrobić? Idealnie byłoby, gdyby wiadomość e-mail trafiała automatycznie na określony adres e-mail po zapisaniu węzła.

Przekonałem się, że połączenie reguł i poczty HTML pozwala osiągnąć to, czego chcę. Z wyjątkiem ... Podczas tworzenia akcji reguły nie ma możliwości wysłania wiadomości e-mail do całego węzła (w tym tematów node.tpl.php). Reguły dają tylko opcję wysyłania pocztą e-mail określonych pól węzłów (bez tematów).

Wszelkie sugestie będą mile widziane!

Odpowiedzi:


20

Oto inne podejście. (Kod jest dostępny w tym obszarze izolowanym ).

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

Zawartość pliku instalacyjnego i klasa NodemailMailSystem są używane, aby umożliwić temu modułowi wysyłanie wiadomości e-mail w formacie HTML. Dwie pozostałe funkcje to implementacje hook_mail () i hook_node_insert (), które zajmują się wysyłaniem wiadomości e-mail po utworzeniu węzła mycontenttype. Jedną rzeczą, na którą musisz zwrócić uwagę jest to, że Drupal użyje pliku szablonu węzła kompozycji, który jest używany na stronach tworzenia węzłów (lub rdzeń node.tpl.php, jeśli motyw go nie ma) dla widoku węzła . Możesz także sprawdzić funkcje tutaj node_view () i drupal_mail () . To wszystko powinno działać z podstawową funkcjonalnością Drupala 7 (nie są wymagane żadne moduły).


Dzięki! Działa to z wyjątkiem… W mojej witrynie szablon węzła zmienia się zgodnie z terminem systematyki. Jeśli więc użytkownik oznaczy węzeł terminem 1, szablon 1 zostanie użyty do renderowania węzła. (patrz drupal.stackexchange.com/questions/23688/… ). Kiedy używam twojego kodu, używany jest tylko domyślny plik node.tpl.php (a nie szablon używany do renderowania węzła). Czy jest jakiś sposób to naprawić? (Przepraszam, jeśli wydaje mi się to uciążliwe, że nie wspominałem o tym wcześniej - myślałem, że nie będzie to problemem, ponieważ renderowany węzeł zawiera szablon).
big_smile,

@big_smile Problem jest prawdopodobnie tym, o czym wspomniałem w mojej odpowiedzi: motyw administratora używany do tworzenia węzłów. Możliwe poprawki, które mogę obecnie wymyślić: 1) użyj domyślnego motywu do edycji / tworzenia treści (odznacz pole wyboru w „admin / wygląd”) 2) skopiuj niezbędny kod z template.php i szablonów węzłów do folderu motywów administracyjnych i wyczyść pamięć podręczną 3) utwórz niestandardowe szablony w module dla wiadomości e-mail.
Madis,

6

Możesz utworzyć token, który był renderowanym węzłem, lub utworzyć niestandardową akcję Reguły, która wyśle ​​renderowany węzeł.

Chcesz spojrzeć

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

Zaktualizowany o kod

Ten kod pokazuje, jak dodać właściwość do wszystkich węzłów, które można udostępnić w regułach. Stworzyłem ten moduł o nazwiegoogletorp

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

Pierwszą funkcją jest haczyk, który dodaje właściwość do węzła, gdzie w wywołaniu zwrotnym jest zdefiniowane dostarczanie danych. Druga funkcja to rzeczywiste wywołanie zwrotne, które zwraca renderowany węzeł.

Aby to zadziałało, musisz zainstalować moduł tokenów encji, który jest częścią modułu API encji , ale i tak jest to wymagane przez reguły.


Dzięki - właśnie tego potrzebuję. Ale jak ty to robisz? Pobrałem Reguły i Token, ale nie ma opcji wysłania renderowanego węzła.
big_smile

@big_smile Musisz sam stworzyć tę funkcjonalność - jest na to kilka sposobów.
googletorp

Dziękuję za poświęcony czas na odpowiedź. Szczerze mówiąc, twoje odpowiedzi nie są zbyt pomocne. Gdybym wiedział, jak sam stworzyć tę funkcjonalność, nie zadałbym pytania. Oczywiście nie oczekuję od ciebie pełnej odpowiedzi. Byłoby jednak pomocne, gdybyś mógł podać linki do zasobów, które opracowują sposób wykonywania twoich sugestii,
big_smile

2
@big_smile Więc głosujesz za mną, bo nie nakarmiłem cię ręką? Czy próbowałeś google, czy próbowałeś stronę główną projektu? Znalazłem obszerne dokumenty dotyczące zasad w 30 sekund, jestem pewien, że możesz zrobić to samo. Nie bądź leniwy.
googletorp

1
Nie jestem leniwy i nie oczekuję, że będę nakarmiony. Twoja odpowiedź była bardzo niejasna i wcale nie oznacza, że ​​odpowiedź można znaleźć w dokumencie Reguły. W rzeczywistości „Stworzyłbyś tę funkcjonalność samodzielnie” oznacza, że ​​musiałbym stworzyć coś, co jest poza Regułami. Właśnie dlatego głosowałem za odpowiedzią - była zbyt ogólnikowa, aby była pomocna. Jednak patrząc na twój profil widzę, że jesteś bardzo pomocny i na podstawie tego nie sądzę, że miałeś zamiar być niejasny. Nie sądziłem, że głosowanie w dół byłoby bardzo denerwujące. Odwróciłbym to, gdybym mógł. Mam nadzieję, że nie ma twardych uczuć.
big_smile

1

Inną opcją byłoby użycie mojego modułu Entity2Text (DRupal 7).

Obecnie daje token „textexport” dla każdego trybu widoku encji. Działa to dobrze dla wielu typów pól, ale ma pewne problemy bardziej złożone, takie jak pole adresu.

Zamierzam również dodać „htmlexport”. Jeśli chcesz spróbować, sprawdź tę gałąź: http://drupalcode.org/project/entity2text.git/shortlog/refs/heads/7.x-1-htmlexport

Nadal będziesz musiał korzystać z Rules i MimeMail (lub prawdopodobnie wspomnianego wyżej htmlmaila).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.