web-dev-qa-db-ja.com

VBOを使用して電子メールを送信するための私のルールの何が問題になっていますか?

ノードの作成時に一連のユーザーにメールを送信しようとしているため、VBOフィールドとそのルールを含むユーザービューを作成しました。以下の設定を確認できます。それはD7についてです。

enter image description hereenter image description here

ただし、ルールが実行されると、メールは送信されず、admin/reports/dblogに次のメッセージが表示されます。

ループを評価できません。

変数entitylistemを取得できません。定義されていません。

アクションviews_bulk_operations_action_load_listを評価できません。

データ値を取得できません。エラー:無効なデータ値が指定されました。必要なデータ型と形式に一致することを確認してください。 user()の値:

なにが問題ですか?

1
Xtrageik

明らかに、あなたが仕事に就こうとしていることに「何か」が間違っています。 「 ルール内の変数の値をどのように表示できますか? 」で説明されているように、 ルール デバッグを有効にすることをお勧めします。必要に応じて、ルール実行ログのコピーを質問の更新として追加します。

また、チュートリアル「 VBOが有効なビューの結果をルールで処理する方法 」も確認してください。

Plan B

(VBOを使用する代わりに) ビュールール モジュールを、解決しようとしているパズルに関与させることもできます。このモジュールの詳細(プロジェクトページから):

ルールアクションおよびループとしてビューを直接提供し、ビューの結果データをシームレスに使用します。

(まだ)ルールに慣れていない場合、前の引用は少し不可解に思えるかもしれません(「何が、これが私にどのように役立ちますか?」)そのため、これらのモジュールを使用して前進する方法についての詳細がいくつかあります。

  1. Views を使用して)ビューを作成し、メールを送信するユーザーごとに1つのビュー結果(行)を作成します。そのビューには、メールの作成に使用する各フィールドのフィールド(列)があります。 。そのため、既存のビューは既にかなり近くなっている可能性があります(VBOフィールドを削除するだけの場合)。重要:ビューの表示タイプとして「ルール」を使用してください。
  2. Views Rules モジュールを使用してカスタムルールを作成し、「ルールループ」と呼ばれるルール手法を使用して、これらの各ビューの結果をルールアクションで反復します。
  3. ルールループの反復ステップごとに、ルールアクションを実行して... euh ... right ...電子メールを送信します。この時点で、ビューの結果の各列のすべてのデータが、いわゆるルールパラメータとして利用できるようになります。したがって、その時点で適切な電子メールを作成することは簡単です。
  4. 残っている唯一のことは、このルールがトリガーされるために使用するルールイベントについて決定することです。しかし、それはあなた自身の想像力次第です(どんなルールイベントもします)。あなたの場合:既存のルールイベントも問題ないはずです。必要に応じて、独自の想像力に応じて、ルール条件を追加することもできます。

簡単でいいですか?

PS:この質問はD7に関するものだと思います...

2
Pierre.Vriens

このようなカスタムルールアクションを単純に記述することをお勧めします

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を選択します。

2
Gaurav Rajdeo

「問題」(最初のルールアクションで生成されたエラー)は、使用しているルールイベントが原因である可能性が非常に高いです(= "新しいコンテンツを保存した後 ")、これは単に正しいイベントではない可能性があります。私を信じてはいけない...まだ...驚いて読むために読んでください...

イベントのバリエーションであるイベントについて issue#430274 を見て、どういうわけかそれを説明します After saving something 実際に起こる... Before saving something (これはバグではなく、単純に Rules モジュールの動作方法...).

この種の問題を回避するための可能な妥協案は、実行しようとしていることをルールコンポーネントに変換することです。これにより、元のルールがそのルールコンポーネントの「実行をスケジュール」します(例:ルールスケジューラサブモジュールを使用)。またはmins「その新しいユーザーアカウントを保存した後」... cronジョブが十分に頻繁に実行される場合、それ以外の場合はcronが次回実行されるとき)。この妥協により、ルールコンポーネントが実行されるときに、コンテンツが確実に保存されます...(それが理由でそれが空である理由になることはありません...)。

1
Pierre.Vriens

VBOの最新バージョンにバグがあるようです。

修正については https://groups.drupal.org/node/516374#comment-1153591 をチェックしてください

0
sherrmann