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


9

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

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

ルール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電子メールを送信できるようにします。他の2つの関数は、のノードが作成されたときに電子メールを送信することを処理するhook_mail()およびhook_node_insert()の実装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)コンテンツの編集/作成にデフォルトのテーマを使用します(「admin / appearance」のチェックボックスをオフにします)2)必要なコードをtemplate.phpとノードテンプレートから管理テーマフォルダーにコピーし、キャッシュをクリア3)電子メール用のモジュールでカスタムテンプレートを作成します。
Madis

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

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

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


ありがとう-それがまさに私が必要としていることです。しかし、どうやってそれを行うのですか?ルールとトークンをダウンロードしましたが、レンダリングされたノードを送信するオプションがありません。
big_smile 2012

@big_smileこの機能を自分で作成する必要があります-これにはいくつかの方法があります。
googletorp

返信に時間を割いていただきありがとうございます。正直なところ、あなたの答えはあまり役に立ちません。自分で機能を作成する方法を知っていれば、質問することはありません。もちろん、完全な回答を投稿することは期待していません。あなたは、あなたの提案を実行する方法について手の込んだことをリソースへのリンクを提供することができればしかし、それが参考になる
big_smile

2
@big_smileそれで、私があなたに手渡ししなかったので、あなたは私に反対票を投じますか?グーグルを試しましたか、プロジェクトのホームページを試しましたか?30秒で広範なルールドキュメントを見つけました。きっと同じことができると思います。怠惰にしないでください。
googletorp

1
私は怠惰ではなく、食事をすることを期待していません。あなたの答えは非常にあいまいであり、その答えが規則ドキュメントで見つかることをまったく意味していません。実際、「この機能を自分で作成する」ということは、ルールの外側にあるものを作成しなければならないことを意味します。これが、私があなたの回答に反対票を投じた理由です-役に立たないほど曖昧でした。しかし、あなたのプロフィールを見ると、あなたはとても役に立っています。これに基づいて、漠然とするのはあなたの意図ではなかったと思います。私は反対票が非常に動揺するとは思わなかった。できれば逆にします。辛い気持ちはないですね。
big_smile 2012年

1

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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.