独自のカスタムnode.tpl.phpファイルを作成しました。ユーザーがそのコンテンツタイプの新しいノードを作成するたびに、ノード全体をメールで送信したいと思います(node.tpl.phpファイル内のすべてのHTMLがメールフレンドリーであることを確認しました)。
これどうやってするの?理想的には、ノードが保存されたときに、電子メールが特定の電子メールアドレスに自動的に送信されるようにしたいと考えています。
Rules と HTML Mail を組み合わせることで、私が望むことを実現できることがわかりました。例外...ルールアクションを作成する場合、ノード全体(node.tpl.phpテーマを含む)にメールを送信するオプションはありません。ルールは、特定のノードフィールド(テーマなし)を電子メールで送信するオプションのみを提供します。
任意の提案が最も高く評価されます!
ここに別のアプローチがあります。 (コードは このサンドボックス で利用できます。)
name = Nodemail
description = Sends node e-mails.
core = 7.x
<?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);
}
<?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つのコア機能(提供されたモジュールは必要ありません)。
レンダリングされたノードであるトークンを作成するか、レンダリングされたノードを送信するカスタムルールアクションを作成できます。
見たい
$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モジュール の一部であるエンティティトークンモジュールをインストールする必要がありますが、これはとにかくルールで必要です。
別のオプションは、私のモジュールを使用することです Entity2Text (DRupal 7)。
現在、エンティティのすべての表示モードに「textexport」トークンを提供しています。これは多くのフィールドタイプでうまく機能しますが、住所フィールドのような複雑なタイプの問題があります。
「htmlexport」も追加します。試してみたい場合は、このブランチをチェックアウトしてください: http://drupalcode.org/project/entity2text.git/shortlog/refs/heads/7.x-1-htmlexport
それでもルールと MimeMail (またはおそらく上記のhtmlmail)を使用する必要があります。