Отправить весь узел по электронной почте (включая содержимое шаблона)


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-письма. Две другие функции являются реализациями hook_mail () и hook_node_insert (), которые занимаются отправкой электронных писем при создании узла mycontenttype. Стоит отметить, что Drupal будет использовать файл шаблона узла той темы, который используется для страниц создания узла (или core node.tpl.php, если у темы его нет) для представления узла. , Вы также можете проверить функции node_view () и drupal_mail () , которые здесь используются. Все это должно работать с базовой функциональностью Drupal 7 (дополнительные модули не нужны).


Спасибо! Это работает за исключением ... На моем сайте шаблон для узла изменяется в соответствии с термином таксономии. Поэтому, если пользователь помечает узел термином 1, шаблон 1 используется для визуализации узла. (см. drupal.stackexchange.com/questions/23688/… ). Когда я использую ваш код, используется только файл node.tpl.php по умолчанию (а не шаблон, используемый для визуализации узла). Есть ли способ это исправить? (Извините, если мне кажется неприятным, что я не упомянул об этом раньше - я подумал, что это не будет проблемой, потому что визуализированный узел действительно содержит шаблон).
big_smile

@big_smile Проблема, вероятно, в том, что я упомянул в своем ответе: тема администратора, которая используется для создания узла. Возможные исправления, о которых я могу подумать в настоящее время: 1) использовать вашу тему по умолчанию для редактирования / создания контента (снимите флажок в «admin / появление») 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

Спасибо что нашли время ответить. Если честно, ваши ответы не очень полезны. Если бы я знал, как создать функциональность самостоятельно, я бы не задавал вопрос. Очевидно, я не ожидаю, что вы отправите полный ответ. Тем не менее, было бы полезно , если бы вы могли предоставить ссылки на ресурсы , которые тщательно о том , как выполнить свои предложения,
big_smile

2
@big_smile Значит, ты меня опроверг, потому что я тебя не кормил? Вы пробовали Google, вы пробовали домашнюю страницу проекта? Я нашел обширные документы по правилам за 30 секунд, я уверен, что вы можете сделать то же самое. Не ленись.
googletorp

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

1

Другой вариант будет использовать мой модуль Entity2Text (DRupal 7).

Прямо сейчас он дает токен «textexport» для каждого режима просмотра объекта. Это хорошо работает для многих типов полей, но имеет некоторые более сложные проблемы, такие как Address Field.

Я также собираюсь добавить "htmlexport". Если вы хотите попробовать это, ознакомьтесь с этой веткой: http://drupalcode.org/project/entity2text.git/shortlog/refs/heads/7.x-1-htmlexport

Вам все равно придется использовать Rules и MimeMail (или, возможно, htmlmail, упомянутый выше).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.