Как запланировать выполнение действия Правил на основе поля даты отправки веб-формы?
Как мне запланировать выполнение действия Правил на основе поля даты отправки веб-формы?
Я установил Правила веб-формы , поэтому я могу использовать событие Правил Отправленная веб-форма для запуска выполнения Действия Правил. В моем случае я хочу запланировать выполнение действия Правил на основе ввода даты в поле веб-формы.
У меня нет проблем с планированием выполнения с использованием node:creation time
, но мне нужно использовать дату, когда пользователь входные.
Я не нашел никакого селектора данных, который позволил бы мне это сделать.
Любой намек будет очень признателен.
РЕДАКТИРОВАТЬ: Я нашел ссылку на StackOverflow, которая, похоже, связана с тем, чего я хочу достичь.
Https://stackoverflow.com/questions/5192108/how-do-i-schedule-a-rule-using-fields
Это свело бы мой вопрос к следующему: как мне использовать Сущность имеет поле в веб-форме, чтобы сделать это поле доступным?
6 answers
"Ключ" к тому, что вы пытаетесь заставить работать, заключается в том, что у вас есть доступ ко всем этикетки и все ценности любого поля веб-формы, т.е.:
-
[data:MachineFieldName-title]
содержит Метку поля с именем машины MachineFieldName. -
[data:MachineFieldName-value]
содержит Значение поля с именем машины MachineFieldName
Все, что осталось, чтобы полностью ответить на ваш вопрос, - это использовать аналогичное правило жетоны.
Для получения более подробной информации об этом и правила прототипа об этом см. Ответ на " Как создать узел из веб-формы с использованием правил?":
- 1-я попытка связана с использованием "У сущности есть поле" (которое не работает для веб-формы )
- 2-я попытка объясняет, что делать в случае Веб-формы.
Я не очень хорошо знаком с Правилами, но это может быть шагом в правильном направлении.
Если бы узел: созданный работал, вы могли бы дать http://drupal.org/project/webform_tokens попробуйте, он должен определить токены для компонентов вашей формы, однако я не уверен, будет ли дата в правильном формате.
Если он не в правильном формате, вы можете изменить его для компонента в крючке предварительного сохранения .
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;
}
Теперь вы изменили данные для отправки, преобразование даты в метку времени, которую затем следует использовать с помощью webform_tokens, как и node:created.
Редактировать: Хорошо, перечитайте вопрос, и я совершенно упустил суть. Удалил всю информацию об обработке электронной почты.
Шаг №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;
}
}
?>
Оказывается, данные отправки веб-формы завернуты в свой собственный тип, и поэтому поля даты из отправлений веб-формы не распознаются модулем Правил как даты.
Единственным решением, которое я нашел, было превратить мою веб-форму в другой тип узла и использовать представления для эмуляции результатов веб-формы. Поля даты в моих пользовательских типах узлов распознаются модулем "Правила", и я могу планировать отправку писем.
Существует открытая проблема в d.o., чтобы изменить способ веб-форма хранит эти данные.
Я считаю, что то, что вы пытаетесь сделать, невозможно. Причина в том, что данные отправки веб-формы не хранятся в базе данных. Поэтому вы можете получить доступ к данным веб-формы только в случае, например, "При отправке формы".
Но, возможно, вы могли бы дать немного больше информации о поле, из которого вы пытаетесь создать правило. Это поле, которое вы могли бы записать в профиль пользователя, чтобы иметь к нему доступ без необходимости знать идентификатор sid отправки? Может быть после сохранения его в профиле вы можете найти другой способ создать правило для этого конкретного поля, которое теперь связано исключительно с пользователем, отправившим форму.
Съемка в темноте, но, возможно, подмодуль API сущности модуля "Маркер сущности" поможет. Вот цитата об этом подмодуле (со страницы проекта модуля):
...гарантирует наличие маркеров для большинства свойств и полей сущности, т.Е. Обеспечивает замену маркеров для всех свойств сущности (или полей), которые не имеют маркеров и известны модулю сущности.