web-dev-qa-db-ja.com

ルールのメールアクションを介してトークン内でトークンをレンダリングするにはどうすればよいですか?

ルールでノードを送信したい。 [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" : [ "" ]
          }
        }
      ]
    }
  }
]

}}

4
Nigel Waters

[編集]

他の回答も機能しますが、これはビュールールを使用した現在の実装に最も単純で最も近いものです。

まず、モジュールを有効にしてください 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;
?>
1
argiepiano

ノードの本文内でトークンを使用し、ルールアクションで_[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_の相対パスにアクセスすると、次のようになります。

  1. (データブロックに含まれている)SQLクエリを実行します。
  2. データブロック(SQLステートメント)によって返された各結果を反復処理します。
  3. 各反復で、すべてのトークンを解決します(つまり、_Dear {name}_内として)。
  4. EMailが実際にどのように見えるかを表示します(反復ごとに)。
  5. 「eMail」というタイトルのリンク(右上)を追加します。実際にその「メール」リンクをクリックすると、次の詳細を含む確認画面が表示されます。
    • 電子メールで送信される電子メールの数(=データブロックの行数)。
    • 電子メールを送信するか、実際にすべての電子メールを送信するためのラジオボタン。

上記を念頭に置いて、これはあなたのケースのためにそれを機能させるために必要なものです:

  • 提供されたサンプルのクローンを作成し、以下のように調整します。
  • ビューと同じように、データブロックを調整して目的のデータ(列)を取得します。または、ニーズに合った新しいものを作成して、代わりに使用します。 _field_ef_email_および_field_ef_first_name_に関連するデータを必ず含めてください。
  • FromToおよびSubjectをニーズに合わせて調整します。
  • 電子メールの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>_

2
Pierre.Vriens

以下は、プロファイルとコマース製品、カスタムエンティティ、コマースクレジットに基づいてメールメッセージを作成します。

独自のルールやルールハンドラーをコーディングせずに、これらすべてのものを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);
}

データ構築クラス

コールバック関数は、ルールとセカンダリソースからデータをまとめる一連のクラスを呼び出します。

これをすべてデータオブジェクトに押し込みます。

電話drupalメール

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;

}}

1
Interlated