Как запланировать выполнение действия Правил на основе поля даты отправки веб-формы?


Как мне запланировать выполнение действия Правил на основе поля даты отправки веб-формы?

Я установил Правила веб-формы , поэтому я могу использовать событие Правил Отправленная веб-форма для запуска выполнения Действия Правил. В моем случае я хочу запланировать выполнение действия Правил на основе ввода даты в поле веб-формы.

У меня нет проблем с планированием выполнения с использованием node:creation time, но мне нужно использовать дату, когда пользователь входные.

Я не нашел никакого селектора данных, который позволил бы мне это сделать.

Любой намек будет очень признателен.

РЕДАКТИРОВАТЬ: Я нашел ссылку на StackOverflow, которая, похоже, связана с тем, чего я хочу достичь.

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

Это свело бы мой вопрос к следующему: как мне использовать Сущность имеет поле в веб-форме, чтобы сделать это поле доступным?

Author: Community, 2012-04-20

6 answers

"Ключ" к тому, что вы пытаетесь заставить работать, заключается в том, что у вас есть доступ ко всем этикетки и все ценности любого поля веб-формы, т.е.:

  • [data:MachineFieldName-title] содержит Метку поля с именем машины MachineFieldName.
  • [data:MachineFieldName-value] содержит Значение поля с именем машины MachineFieldName

Все, что осталось, чтобы полностью ответить на ваш вопрос, - это использовать аналогичное правило жетоны.

Для получения более подробной информации об этом и правила прототипа об этом см. Ответ на " Как создать узел из веб-формы с использованием правил?":

  • 1-я попытка связана с использованием "У сущности есть поле" (которое не работает для веб-формы )
  • 2-я попытка объясняет, что делать в случае Веб-формы.
 1
Author: Pierre.Vriens, 2017-04-13 12:47:02

Я не очень хорошо знаком с Правилами, но это может быть шагом в правильном направлении.

Если бы узел: созданный работал, вы могли бы дать 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
Author: oxy, 2012-04-23 19:00:07

Редактировать: Хорошо, перечитайте вопрос, и я совершенно упустил суть. Удалил всю информацию об обработке электронной почты.

Шаг №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
Author: Johnathan Elmore, 2012-04-24 20:34:54

Оказывается, данные отправки веб-формы завернуты в свой собственный тип, и поэтому поля даты из отправлений веб-формы не распознаются модулем Правил как даты.

Единственным решением, которое я нашел, было превратить мою веб-форму в другой тип узла и использовать представления для эмуляции результатов веб-формы. Поля даты в моих пользовательских типах узлов распознаются модулем "Правила", и я могу планировать отправку писем.

Существует открытая проблема в d.o., чтобы изменить способ веб-форма хранит эти данные.

 1
Author: drcelus, 2012-04-26 09:58:54

Я считаю, что то, что вы пытаетесь сделать, невозможно. Причина в том, что данные отправки веб-формы не хранятся в базе данных. Поэтому вы можете получить доступ к данным веб-формы только в случае, например, "При отправке формы".

Но, возможно, вы могли бы дать немного больше информации о поле, из которого вы пытаетесь создать правило. Это поле, которое вы могли бы записать в профиль пользователя, чтобы иметь к нему доступ без необходимости знать идентификатор sid отправки? Может быть после сохранения его в профиле вы можете найти другой способ создать правило для этого конкретного поля, которое теперь связано исключительно с пользователем, отправившим форму.

 0
Author: Perisdr, 2012-04-23 09:23:17

Съемка в темноте, но, возможно, подмодуль API сущности модуля "Маркер сущности" поможет. Вот цитата об этом подмодуле (со страницы проекта модуля):

...гарантирует наличие маркеров для большинства свойств и полей сущности, т.Е. Обеспечивает замену маркеров для всех свойств сущности (или полей), которые не имеют маркеров и известны модулю сущности.

 0
Author: Bryan Casler, 2015-04-27 16:35:32