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を使用してフィールドを使用可能にするにはどうすればよいですか?
あなたが仕事をしようとしているものへの「手がかり」は、すべてにアクセスできることですlabelsおよびWebフォームの任意のフィールドのすべてのvalues、すなわち:
[data:MachineFieldName-title]
には、マシン名MachineFieldNameを持つフィールドのLabelが含まれています。[data:MachineFieldName-value]
には、マシン名MachineFieldNameを持つフィールドのValueが含まれていますあなたの質問に完全に答えるために残されているすべてはあなたのルールが同様のトークンを使用することです。
これの詳細と、これに関するプロトタイプルールについては、「 ルールを使用してWebフォームからノードを作成する方法 」への回答を参照してください。
Webフォーム送信データは独自のタイプでラップされているため、Webフォーム送信の日付フィールドは、ルールモジュールによって日付として認識されません。
私が見つけた唯一の回避策は、Webフォームを別のノードタイプに変換し、ビューを使用してWebフォームの結果をエミュレートすることでした。カスタムノードタイプの日付フィールドはルールモジュールによって認識され、送信するメールをスケジュールできます。
未解決の問題 がd.oにあります。 Webフォームがデータを保存する方法を変更します。
ルールについてはあまり詳しくありませんが、これは正しい方向への一歩かもしれません。
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:「処理済み」の非表示フィールドを作成します。これを使用して、一度だけ処理されることを確認できます。
ステップ#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;
}
}
?>
暗闇での撮影ですが、おそらく Entity API モジュールの「Entity Token」サブモジュールが役立ちます。以下は、そのサブモジュールに関する引用です(モジュールのプロジェクトページから)。
...ほとんどのエンティティプロパティとフィールドにトークンがあることを確認します。つまり、トークンがなく、エンティティモジュールに認識されているすべてのエンティティプロパティ(またはフィールド)のトークンを置き換えます。
あなたがしようとしていることは不可能だと思います。その理由は、Webフォーム送信データがデータベースに保存されていないためです。したがって、「フォームが送信されたとき」などのイベントでのみWebフォームデータにアクセスできます。
しかし、ルールを作成しようとしているフィールドについて、もう少し情報を提供できます。提出のsidを知らなくてもアクセスできるように、ユーザーのプロファイルに書き込むことができるフィールドですか?それをプロファイルに保存した後、フォームを送信したユーザーに排他的にリンクされている特定のフィールドに関するルールを作成する別の方法を見つけることができます。