ノードの作成時に一連のユーザーにメールを送信しようとしているため、VBOフィールドとそのルールを含むユーザービューを作成しました。以下の設定を確認できます。それはD7についてです。
ただし、ルールが実行されると、メールは送信されず、admin/reports/dblogに次のメッセージが表示されます。
ループを評価できません。
変数entitylistemを取得できません。定義されていません。
アクションviews_bulk_operations_action_load_listを評価できません。
データ値を取得できません。エラー:無効なデータ値が指定されました。必要なデータ型と形式に一致することを確認してください。 user()の値:
なにが問題ですか?
明らかに、あなたが仕事に就こうとしていることに「何か」が間違っています。 「 ルール内の変数の値をどのように表示できますか? 」で説明されているように、 ルール デバッグを有効にすることをお勧めします。必要に応じて、ルール実行ログのコピーを質問の更新として追加します。
また、チュートリアル「 VBOが有効なビューの結果をルールで処理する方法 」も確認してください。
Plan B
(VBOを使用する代わりに) ビュールール モジュールを、解決しようとしているパズルに関与させることもできます。このモジュールの詳細(プロジェクトページから):
ルールアクションおよびループとしてビューを直接提供し、ビューの結果データをシームレスに使用します。
(まだ)ルールに慣れていない場合、前の引用は少し不可解に思えるかもしれません(「何が、これが私にどのように役立ちますか?」)そのため、これらのモジュールを使用して前進する方法についての詳細がいくつかあります。
簡単でいいですか?
PS:この質問はD7に関するものだと思います...
このようなカスタムルールアクションを単純に記述することをお勧めします
function mymodule_rules_action_info() {
return array(
'_send_new_content_mail' => array(
'label' => t('Send Mail to users for new content'),
'parameter' => array(
'node' => array('type' => 'node', 'label' => t('Current Node')),
),
'group' => t('custom'),
),
);
}
コールバックを定義します。
function _send_new_content_mail($node) {
global $base_url;
$query = db_select('users', 'u');
$query->join('users_roles', 'r', 'u.uid = r.uid');
$query->leftJoin('field_data_field_first_name', 'n', 'u.uid = n.entity_id');
$query->leftJoin('field_data_field_last_name', 'l', 'u.uid = l.entity_id');
$query->fields('u', array('mail', 'name'));
$query->fields('n', array('field_first_name_value'));
$query->fields('l', array('field_last_name_value'));
$query->condition('r.rid', ROLE_ID, '=');
$result = $query->execute()->fetchAll();
foreach ($result as $val) {
$alias = drupal_get_path_alias('node/' . $node->nid);
$data = 'Hi ' . $val->field_first_name_value . ' ' . $val->field_last_name_value . ', new content has been published of your interest. ';
$data .= 'Click ' . l('here', $base_url . '/' . $alias) . ' to see the content.';
$key = 'new_content_mail';
$subject = 'New content published';
$to = $val->mail;
_get_mail_content($data, $to, $key, $subject);
}
}
次に、メール内容関数を定義します。
function _get_mail_content($data, $to, $key, $subject) {
$mail_content = _mail_content($data, $key);
$params = array(
'body' => $mail_content,
'subject' => $subject,
);
$mail = drupal_mail('module_name', $key, $to, language_default(), $params, '[email protected]', TRUE);
if ($mail['result']) {
return TRUE;
}
else {
$error_msg = 'Failed to send the email!';
watchdog('new-content-email', $error_msg, array(), WATCHDOG_ALERT);
return FALSE;
}
}
_mail_contentを定義します。
function _mail_content($data , $key) {
switch ($key) {
case 'new_content_mail':
return theme('mymodule_new_content_mail', array('data' => $data));
break;
}
}
次に、hook_theme()でテンプレートファイルを定義し、その中に$ dataを出力します。
function mymodule_theme() {
return array(
'mymodule_new_content_mail' => array(
'template' => 'mymodule-new-content-mail',
'path' => drupal_get_path('module', 'mymodule') . '/templates',
'variables' => array('data' => NULL),
),
);
}
新しいルールを追加し、イベントノードを選択してから新しいコンテンツを公開し、メールを送信する条件にノードタイプを追加し、「カスタム」の下に表示されるアクションで_send_new_content_mailを選択します。
「問題」(最初のルールアクションで生成されたエラー)は、使用しているルールイベントが原因である可能性が非常に高いです(= "新しいコンテンツを保存した後 ")、これは単に正しいイベントではない可能性があります。私を信じてはいけない...まだ...驚いて読むために読んでください...
イベントのバリエーションであるイベントについて issue#430274 を見て、どういうわけかそれを説明します After saving something 実際に起こる... Before saving something (これはバグではなく、単純に Rules モジュールの動作方法...).
この種の問題を回避するための可能な妥協案は、実行しようとしていることをルールコンポーネントに変換することです。これにより、元のルールがそのルールコンポーネントの「実行をスケジュール」します(例:ルールスケジューラサブモジュールを使用)。またはmins「その新しいユーザーアカウントを保存した後」... cronジョブが十分に頻繁に実行される場合、それ以外の場合はcronが次回実行されるとき)。この妥協により、ルールコンポーネントが実行されるときに、コンテンツが確実に保存されます...(それが理由でそれが空である理由になることはありません...)。
VBOの最新バージョンにバグがあるようです。
修正については https://groups.drupal.org/node/516374#comment-1153591 をチェックしてください