web-dev-qa-db-ja.com

Webフォーム送信日フィールドに基づいてルールアクションの実行をスケジュールする方法

Webフォーム送信日フィールドに基づいてルールアクションの実行をスケジュールするにはどうすればよいですか?

Webform Rules をインストールしたので、RulesイベントWebform submitedを使用してルールアクションの実行をトリガーできます。私の場合、Webフォームフィールドの日付入力に基づいてルールアクションの実行をスケジュールしたいと思います。

node:creation timeを使用して実行をスケジュールすることに問題はありませんが、ユーザーが入力した日付を使用する必要があります。

これを実行させるデータセレクターは見つかりませんでした。

ヒントは大歓迎です。

編集:私が達成したいことに関連していると思われるStackOverflowのリンクを見つけました。

https://stackoverflow.com/questions/5192108/how-do-i-schedule-a-rule-using-fields

それは私の質問を次のように減らします:WebフォームでEntity has fieldを使用してフィールドを使用可能にするにはどうすればよいですか?

3
drcelus

あなたが仕事をしようとしているものへの「手がかり」は、すべてにアクセスできることですlabelsおよびWebフォームの任意のフィールドのすべてのvalues、すなわち:

  • [data:MachineFieldName-title]には、マシン名MachineFieldNameを持つフィールドのLabelが含まれています。
  • [data:MachineFieldName-value]には、マシン名MachineFieldNameを持つフィールドのValueが含まれています

あなたの質問に完全に答えるために残されているすべてはあなたのルールが同様のトークンを使用することです。

これの詳細と、これに関するプロトタイプルールについては、「 ルールを使用してWebフォームからノー​​ドを作成する方法 」への回答を参照してください。

  • 1回目の試行は「エンティティにフィールドがあります」の使用に関連しています(これは Webform では機能しません)
  • 2回目の試行は、 Webform の場合の対処方法を説明します。
1
Pierre.Vriens

Webフォーム送信データは独自のタイプでラップされているため、Webフォーム送信の日付フィールドは、ルールモジュールによって日付として認識されません。

私が見つけた唯一の回避策は、Webフォームを別のノードタイプに変換し、ビューを使用してWebフォームの結果をエミュレートすることでした。カスタムノードタイプの日付フィールドはルールモジュールによって認識され、送信するメールをスケジュールできます。

未解決の問題 がd.oにあります。 Webフォームがデータを保存する方法を変更します。

1
drcelus

ルールについてはあまり詳しくありませんが、これは正しい方向への一歩かもしれません。

Node:createdが機能した場合、 http://drupal.org/project/webform_tokens を試してみると、フォームコンポーネントのトークンが定義されるはずですが、日付が含まれるかどうかはわかりません正しいフォーマット。

それが正しい形式でない場合は、コンポーネントの presaveフック で変更できます。

function hook_webform_submission_presave($node, $submission) {
  // Use dpm() to find out how the date is formatted, and make it into a timestamp.
  $date = strtotime($submission->data['COMPONENT_ID']['value'][0]);
  $submision->data['COMPONENT_ID']['value'][0] = $date;
}

これで、サブミッションのデータを変更し、日付をタイムスタンプに変換します。これは、node:createdと同じようにwebform_tokensを通じて使用する必要があります。

1
oxy

編集:さて、質問をもう一度読んでください。ポイントを完全に逃しました。電子メール処理に関するすべてのものを削除しました。

ステップ#1:「処理済み」の非表示フィールドを作成します。これを使用して、一度だけ処理されることを確認できます。

ステップ#2:条件を作成し、PHPコードを実行します:

<?php

  // Load the webform by its Node ID
  $webform = node_load(123);

  // Load the webform's submissions by the Node ID
  module_load_include('inc', 'webform', 'includes/webform.submissions');
  $submissions = webform_get_submissions(123);

  // The submission array uses component ids,
  //   so search through the webform and reference component ids by their field name
  foreach($webform->webform['components'] as $component_id => $component)
  {
    if ($component['form_key'] == 'processed')
    {
      $processed_comp_id = $component_id;
    }
    elseif ($component['form_key'] == 'date')
    {
      $date_comp_id = $component_id;
    }
    elseif ($component['form_key'] == 'time')
    {
      $time_comp_id = $component_id;
    }
  }

  // Check all submissions and see if any need to be processed
  foreach($submissions as $submission)
  {
    // First check if the submission has already been processed
    if (isset($submission->data[$processed_comp_id]) &&
        empty($submission->data[$processed_comp_id]['value'][0]))
    {
      // Check the Scheduled Release time
      if (isset($submission->data[$date_comp_id]) && isset($submission->data[$time_comp_id]))
      {
        if (!empty($submission->data[$date_comp_id]['value'][0]) ||
            !empty($submission->data[$time_comp_id]['value'][0]))
        {
          $now = date("U"); // Current UNIX timestamp
          // Check if the current time is still prior to the scheduled time
          if($now < strtotime($submission->data[$date_comp_id]['value'][0]." ".
                                   $submission->data[$time_comp_id]['value'][0]))
          {
            // If it is, continue on to the next submission
            continue;
          }
        }
      }

      // Set the submission to successfully sent, and then update it
      $submission->data[$processed_comp_id]['value'][0] = 1;

      // If it couldn't be updated, change e-mail settings to notify of the error
      if (!webform_submission_update($webform, $submission))
      {
        $email_to = "[email protected]";
        $email_subject = "Error processing scheduled webform rule";
        $email_message = print_r($submission,true);
      }

      // Return True so that it passes the condition
      return true;
    }
  }

?>
1

暗闇での撮影ですが、おそらく Entity API モジュールの「Entity Token」サブモジュールが役立ちます。以下は、そのサブモジュールに関する引用です(モジュールのプロジェクトページから)。

...ほとんどのエンティティプロパティとフィールドにトークンがあることを確認します。つまり、トークンがなく、エンティティモジュールに認識されているすべてのエンティティプロパティ(またはフィールド)のトークンを置き換えます。

0
Bryan Casler

あなたがしようとしていることは不可能だと思います。その理由は、Webフォーム送信データがデータベースに保存されていないためです。したがって、「フォームが送信されたとき」などのイベントでのみWebフォームデータにアクセスできます。

しかし、ルールを作成しようとしているフィールドについて、もう少し情報を提供できます。提出のsidを知らなくてもアクセスできるように、ユーザーのプロファイルに書き込むことができるフィールドですか?それをプロファイルに保存した後、フォームを送信したユーザーに排他的にリンクされている特定のフィールドに関するルールを作成する別の方法を見つけることができます。

0
Perisdr