web-dev-qa-db-ja.com

全体をメールで送信Node(テンプレートの内容を含む)

独自のカスタムnode.tpl.phpファイルを作成しました。ユーザーがそのコンテンツタイプの新しいノードを作成するたびに、ノード全体をメールで送信したいと思います(node.tpl.phpファイル内のすべてのHTMLがメールフレンドリーであることを確認しました)。

これどうやってするの?理想的には、ノードが保存されたときに、電子メールが特定の電子メールアドレスに自動的に送信されるようにしたいと考えています。

RulesHTML Mail を組み合わせることで、私が望むことを実現できることがわかりました。例外...ルールアクションを作成する場合、ノード全体(node.tpl.phpテーマを含む)にメールを送信するオプションはありません。ルールは、特定のノードフィールド(テーマなし)を電子メールで送信するオプションのみを提供します。

任意の提案が最も高く評価されます!

9
big_smile

ここに別のアプローチがあります。 (コードは このサンドボックス で利用できます。)

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

インストールファイルの内容とNodemailMailSystemクラスを使用して、このモジュールがHTML電子メールを送信できるようにします。他の2つの関数は hook_mail()hook_node_insert() の実装であり、mycontenttypeのノードが作成されたときに電子メールを送信します。 Drupalは、ノード作成ページに使用されているテーマのノードテンプレートファイルを使用します(テーマがコアの場合はnode.tpl.phpを使用します)ノードビュー用ではありません。ここで使用されている node_view() および drupal_mail() 関数も確認してください。このすべてが機能するはずです。 Drupal 7つのコア機能(提供されたモジュールは必要ありません)。

20
Madis

レンダリングされたノードであるトークンを作成するか、レンダリングされたノードを送信するカスタムルールアクションを作成できます。

見たい

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

最初の関数は、プロパティをノードに追加するフックであり、データを提供するためにコールバックが定義されています。 2番目の関数は、レンダリングされたノードを返す実際のコールバックです。

これを機能させるには、 エンティティAPIモジュール の一部であるエンティティトークンモジュールをインストールする必要がありますが、これはとにかくルールで必要です。

6
googletorp

別のオプションは、私のモジュールを使用することです Entity2Text (DRupal 7)。

現在、エンティティのすべての表示モードに「textexport」トークンを提供しています。これは多くのフィールドタイプでうまく機能しますが、住所フィールドのような複雑なタイプの問題があります。

「htmlexport」も追加します。試してみたい場合は、このブランチをチェックアウトしてください: http://drupalcode.org/project/entity2text.git/shortlog/refs/heads/7.x-1-htmlexport

それでもルールと MimeMail (またはおそらく上記のhtmlmail)を使用する必要があります。

1
tedbow