Надіслати електронною поштою цілий вузол (включаючи вміст шаблону)


9

Я створив власний власний файл node.tpl.php. Тепер я хочу надіслати електронною поштою весь вузол, кожен раз, коли користувач створює новий вузол цього типу вмісту (я переконався, що всі HTML у моєму файлі node.tpl.php є електронною поштою).

Як я можу це зробити? В ідеалі я хотів би, щоб повідомлення електронної пошти автоматично переходило до певної адреси електронної пошти, коли вузол зберігається.

Я виявив, що комбінація правил та HTML пошти може досягти того, що я хочу. За винятком ... При створенні дії з правилами не існує можливості відправити по електронній пошті весь вузол (включаючи тематизацію node.tpl.php). Правила дають лише можливість надсилати по електронній пошті певні поля вузла (без тематизації).

Будь-які пропозиції були б дуже вдячні!

Відповіді:


20

Ось ще один підхід. (Код доступний у цій пісочниці .)

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

Вміст файлу установки та клас NodemailMailSystem використовуються для того, щоб цей модуль міг надсилати html-повідомлення електронної пошти. Дві інші функції - це реагування на файл_ук_команд () та гак_ноде_інсерт (), які стосуються надсилання електронної пошти при створенні вузла mycontenttype. Одне, що вам потрібно зауважити, - це те, що Drupal буде використовувати файл шаблону вузла теми, що використовується для створення сторінок вузла (або основний node.tpl.php, якщо у нього немає теми) для перегляду вузла . Ви також можете перевірити функції node_view () та drupal_mail () , які тут використовуються. Вся ця річ повинна працювати з основним функціоналом Drupal 7 (модулі, що не надаються) не потрібні.


Дякую! Це працює за винятком… На моєму сайті шаблон вузла змінюється відповідно до терміна таксономії. Отже, якщо користувач позначає вузол терміном 1, шаблон 1 використовується для візуалізації вузла. (див. drupal.stackexchange.com/questions/23688/… ). Коли я використовую ваш код, використовується тільки файл node.tpl.php за замовчуванням (а не шаблон, який використовується для візуалізації вузла). Чи можна це виправити? (Вибачте, якщо мені здається неприємністю не згадувати про це раніше - я вважав, що це не буде проблемою, оскільки виведений вузол містить шаблон).
big_smile

@big_smile Проблема - це, мабуть, те, про що я згадував у своїй відповіді: тема адміністратора, яка використовується для створення вузлів. Можливі виправлення, про які я зараз можу подумати: 1) використовувати тему за замовчуванням для редагування / створення вмісту (зніміть прапорець у розділі "адміністратор / зовнішній вигляд") 2) скопіюйте необхідний код із template.php та шаблонів вузлів у папку теми адміністратора та очистити кеші 3) створити власні шаблони у своєму модулі для електронних листів.
Мадіс

6

Ви можете створити маркер, який був виведеним вузлом, або створити власну дію Правил, яка надішле виведений вузол.

Ви хочете подивитися

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

Оновлено код

Цей код показує, як додати властивість до всіх вузлів, які можна зробити доступними за правилами. Я створив цей модуль під назвою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));
}

Перша функція - це гак, який додає властивість до вузла, де у зворотному дзвінку визначено надання даних. Друга функція - це фактичний зворотний виклик, який повертає виведений вузол.

Для того, щоб це працювало, вам потрібно встановити модуль жетонів сутності, який є частиною модуля API сутності , але це все одно потрібно правилами.


Спасибі - саме це мені і потрібно. Але як це зробити? Я завантажив "Правила" і "Токен", але немає варіантів надіслати виведений вузол.
big_smile

@big_smile Цю функціональність потрібно було б створити самостійно - існує кілька способів зробити це.
googletorp

Дякуємо, що знайшли час для відповіді. Якщо чесно, то ваші відповіді не дуже корисні. Якби я знав, як створити функціонал сам, я б не задавав питання. Очевидно, я не очікую, що ви опублікуєте повну відповідь. Однак було б корисно, якщо ви можете надати посилання на ресурси, які детально
розглядають,

2
@big_smile Отож, ти мене порушив, бо я тебе не рукою годував? Ви спробували google, чи спробували домашню сторінку проекту? Я знайшов обширні документи Правил за 30 секунд, я впевнений, що ви можете зробити те саме. Не лінуйся.
googletorp

1
Я не лінивий і не сподіваюся, що його нагодують. Ваша відповідь була дуже невиразною і зовсім не означає, що відповідь можна знайти в документі Правил. Насправді "Ви б створили цю функціональність самостійно" означає, що мені доведеться створювати щось, що знаходиться поза Правилами. Ось чому я спростував вашу відповідь - це було занадто розпливчасто, щоб бути корисним. Однак, дивлячись на ваш профіль, я можу побачити, що ти дуже корисний, і виходячи з цього, я не думаю, що це був твій намір бути розпливчастим. Я не думав, що голосування за програму буде дуже засмучує. Я би перевернув це, якби міг. Я сподіваюся, що важких почуттів немає.
big_smile

1

Іншим варіантом буде використання мого модуля Entity2Text (DRupal 7).

Зараз він надає маркер "textexport" для кожного режиму перегляду об'єкта. Це добре працює для багатьох типів полів, але має деякі складніші проблеми, такі як Address Address.

Я також збираюся додати "htmlexport". Якщо ви хочете спробувати це, огляньте цю галузь: http://drupalcode.org/project/entity2text.git/shortlog/refs/heads/7.x-1-htmlexport

Вам все одно доведеться використовувати правила і MimeMail (або, можливо, htmlmail, згадані вище).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.