ルールでノードを送信したい。 [node:body]トークンを使用して送信できます。ただし、実際のノード本体でもトークンを使用できるようにしたいと考えています。 (注:これらはグローバルトークンではありません)
ニュースレターのように考えて、私が使用しているボディフィールドで
[field_ef_first_name]様...
ルールアクションメールメッセージの本文に直接入れると、トークンを取得してレンダリングできますが、ノードの本文フィールド自体にある場合は表示されません。
名前フィールドは、ビュールールループから来ています。
エクスポートされたルール:
{ "rules_send_newsletter_when_published" : {
"LABEL" : "Send newsletter when published",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [ "rules" ],
"ON" : { "node_insert--blog" : { "bundle" : "blog" } },
"DO" : [
{ "VIEW LOOP" : {
"VIEW" : "entityforms",
"DISPLAY" : "views_rules_1",
"ROW VARIABLES" : {
"field_ef_email" : { "email" : "Email" },
"field_ef_first_name" : { "first_name" : "First Name" }
},
"DO" : [
{ "mail" : {
"to" : "[email:value]",
"subject" : "[node:title]",
"message" : "[node:body]",
"language" : [ "" ]
}
}
]
}
}
]
}}
[編集]
他の回答も機能しますが、これはビュールールを使用した現在の実装に最も単純で最も近いものです。
まず、モジュールを有効にしてください PHP Filter
また、ブログの本文では次のカスタムトークン形式を使用する必要があります:!first_name!
。この文字列は、ルール内でEntityform field_ef_first_name
フィールドの値に置き換えられます。
これは、オリジナルから変更されたルールのエクスポートバージョンです。 説明のためのスクロールダウン。
{ "rules_send_newsletter_when_published" : {
"LABEL" : "Send newsletter when published",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [ "php", "rules" ],
"ON" : { "node_insert--blog" : { "bundle" : "blog" } },
"DO" : [
{ "VIEW LOOP" : {
"VIEW" : "entityforms",
"DISPLAY" : "views_rules_1",
"ROW VARIABLES" : {
"field_ef_first_name" : { "first_name" : "First name" },
"field_ef_email" : { "email" : "Email" }
},
"DO" : [
{ "variable_add" : {
"USING" : {
"type" : "text",
"value" : "\u003C?php\r\n$text = str_replace(\u0027!first_name!\u0027, $first_name, $node-\u003Ebody[LANGUAGE_NONE][0][\u0027value\u0027]);\r\necho $text;\r\n?\u003E"
},
"PROVIDE" : { "variable_added" : { "processed_body" : "Processed body" } }
}
},
{ "mail" : {
"to" : "[email:value]",
"subject" : "Subject",
"message" : "[processed-body:value]",
"language" : [ "" ]
}
}
]
}
}
]
}
}
ここに説明があります:
このルールの実装では、電子メールを送信する前にアクション「変数を追加」を使用します。この変数に「processed_body」という名前を付けました。 PHP Evaluationを使用して、この変数の値を設定します。
<?php
$text = str_replace('!first_name!', $first_name, $node->body[LANGUAGE_NONE][0]['value']);
echo $text;
?>
基本的に、このスニペットは「トークン」!first_name!
を、ビュールールのループで提供される変数$ first_nameの値に置き換えます。次に、変数processed_body
を使用してメール本文を送信します。
ブログの本文に追加する他のカスタムトークンを手動で処理する必要があることに注意してください。たとえば、受信者の姓を本文に含める場合(!last_name!
など)、str_replace
を正しい値に置き換える!last_name!
関数を手動で追加する必要があります。
[編集2]
!last_name!
"token"置換が追加されたコードは次のとおりです。私はあなたのentityformフィールドがfield_ef_last_name
であり、そのようにルールビューに追加されていると思います。
{ "rules_send_newsletter_when_published" : {
"LABEL" : "Send newsletter when published",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [ "php", "rules" ],
"ON" : { "node_insert--blog" : { "bundle" : "blog" } },
"DO" : [
{ "VIEW LOOP" : {
"VIEW" : "entityforms",
"DISPLAY" : "views_rules_1",
"ROW VARIABLES" : {
"field_ef_first_name" : { "first_name" : "First name" },
"field_ef_email" : { "email" : "Email" },
"field_ef_last_name" : { "last_name" : "Last name" }
},
"DO" : [
{ "variable_add" : {
"USING" : {
"type" : "text",
"value" : "\u003C?php\r\n$text = str_replace(\u0027!last_name!\u0027, $last_name, $node-\u003Ebody[LANGUAGE_NONE][0][\u0027value\u0027]);\r\n$text = str_replace(\u0027!first_name!\u0027, $first_name, $text);\r\necho $text;\r\n?\u003E"
},
"PROVIDE" : { "variable_added" : { "processed_body" : "Processed body" } }
}
},
{ "mail" : {
"to" : "[email:value]",
"subject" : "[node:title]",
"message" : "[processed-body:value]",
"language" : [ "" ]
}
}
]
}
}
]
}
}
追加されたルール変数値のPHPコードは
<?php
$text = str_replace('!last_name!', $last_name, $node->body[LANGUAGE_NONE][0]['value']);
$text = str_replace('!first_name!', $first_name, $text);
echo $text;
?>
ノードの本文内でトークンを使用し、ルールアクションで_[node:body]
_を使用すると、トークンはそのまま(レンダリングせずに)のみ含まれます。ただし、実行しようとしていることに基づいて、目標を達成するためにまったく異なるアプローチを確認することをお勧めします...
Forena モジュールを有効にし(開示:私は共同メンテナーです)、サンプルの1つである Active Users Email (FRX構文を使用)を確認します。モジュールに含まれる(これは、テンプレートメッセージ本文をすべての登録済みユーザーに電子メールで送信するために使用できます) 。
これらは、このFRXファイル内の、ここでの質問に関連する部分です。
データブロック_drupal/active_users
_は、次のようなSQLステートメントです。
_--ACCESS=access administration pages
_
_SELECT uid, name, mail, login, status
_
_FROM {users}
_
_WHERE status=1 order by name
_
_frx:foreach="*"
_。これは、div
内のすべて(データブロックに関連)に対して、データブロックの結果に含まれる各行の反復を引き起こします。
_class="email-body"
_で始まり、置換トークンを含む_Dear {name}
_を含むdiv
は_{name}
_で示されます。
ドキュメント形式「Send eMail」を有効にする_<frx:doc type="email" />
_の行。
モジュールを有効にして、_/reports/drupaladmin.sample_active_users_letter
_の相対パスにアクセスすると、次のようになります。
Dear {name}
_内として)。上記を念頭に置いて、これはあなたのケースのためにそれを機能させるために必要なものです:
field_ef_email
_および_field_ef_first_name
_に関連するデータを必ず含めてください。電子メールのBodyの任意の場所で、必要なトークンを使用します。例えば。その_Dear {name}
_を置き換えます。さらに多くのデータが必要な場合は、適切な名前をデータブロックに追加の列として追加します。サンプルとして、ここに私が作成したFRXファイルの一部を示します。このフォームは、Webフォームの送信を、フォームを送信した各ユーザーへのある種のフォローアップメールに変換するために作成しました。
_<p>Hello,</p>
_
<p>thank you for using our form (with node id = {node}) to submit your feedback (with submission id = {submission}). You're now confirmed via the eMail Id you entered (= {fieldvalue}) to receive eMails from us.</p>
_<p>We'll get back to you shortly for an additional followup eMail.</p>
_
以下は、プロファイルとコマース製品、カスタムエンティティ、コマースクレジットに基づいてメールメッセージを作成します。
独自のルールやルールハンドラーをコーディングせずに、これらすべてのものを1つにまとめようとすることは、あまりにも期待されています。ランダムな複雑さと異種のオブジェクトに関するコメントは、健全な代替手段がないことを意味します。この答えは、ルールのドメインから遠く離れています。
このセットアップには、htmlメールを検出して送信するためのmimemailがあります。
私はハンドラーから始めましたが、カスタムルールは物事を明確にします。
function yhivepasses_rules_action_info() {
$items = array();
$items['yhivepasses_email_passes'] = array(
'label' => t('Send pass email'),
'group' => t('YogaHive Passes'),
'parameter' => array(
'commerce_order' => array(
'type' => 'commerce_order',
'label' => t('Order'),
'description' => t('The order containing the credits bought.'),
),
),
'callbacks' => array(
'execute' => 'yhivepasses_rules_action_send_pass_on_checkout',
),
);
return $items;
}
私はちょうど持っています
function yhivepasses_rules_action_update_on_checkout($order) {
$yogaHivePasses = new YogaHivePasses();
$yogaHivePasses->checkoutRule($order);
}
コールバック関数は、ルールとセカンダリソースからデータをまとめる一連のクラスを呼び出します。
これをすべてデータオブジェクトに押し込みます。
protected function sendToStudio(YogaHivePassDao $passDao) {
$message_studio_contact = [];
$message_studio_contact['module'] = YogaHivePasses::MODULE_NAME;
$this->studioContactEmail($message_studio_contact, $passDao);
$langStudio = $this->mailSetLanguage($message_studio_contact, $passDao->getStudioUser());
$result = drupal_mail(YogaHivePasses::MODULE_NAME, YogaHivePasses::EMAIL_KEY, $passDao->getStudioUser()->mail, $langStudio, $message_studio_contact);
}
これは、テンプレートからHTMLメール本文を作成するメソッドを呼び出します。
これは、テンプレートを定義するhook_themeに依存しています。
public function studioContactEmail(&$message, YogaHivePassDao $passDao) {
// Needs User object. Not bothering with printing out actual order details.
$content_templated = theme('yhivepasses_studiocontact_purchase_studio_email', array(
'passDao' => $passDao,
));
$content_templated .= theme('yhivepasses_email_footer', array());
$message['body'][] = $content_templated;
$message['subject'] = 'Studio pass purchased on YogaHive';
$current_credit = current($credit);
$message['subject'] .= ' ' . $current_credit->credit_type;
$headers = array(
'MIME-Version' => '1.0',
'Content-Type' => 'text/html; charset=UTF-8; format=flowed',
'Content-Transfer-Encoding' => '8Bit',
'X-Mailer' => 'Drupal'
);
foreach ($headers as $key => $value) {
$message['headers'][$key] = $value;
}
}
本文、件名、ヘッダーを正しい場所に追加するには、フックメールが必要です。
function yhivepasses_mail($key, &$message, $params) {
switch ($key) {
case YogaHivePasses::EMAIL_KEY :
$message['subject'] = $params['subject'];
$message['body'] = $params['body'];
// May not be any parameters. Parameters are mainly used to send attachments.
if (array_key_exists('params', $params)) {
$message['params'] = $params['params'];
}
foreach ($params['headers'] as $key => $value) {
$message['headers'][$key] = $value;
}
break;
default:
return;
}}