Как создать узел из веб-формы с помощью правил?


Я хочу создать узел на основе данных веб-формы, используя модуль Правила. Это связано с усложнением отношений внутри соответствующей CRM-системы.

Я уже нахожусь в точке, где у меня создана веб-форма, и добрался до следующей (и рабочей) точки в рамках правил:

{ "rules_member_news_import_" : {
"LABEL" : "Member News (cloned)",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [ "webform_rules", "rules" ],
"ON" : { "webform_rules_submit" : [] },
"IF" : [
  { "webform_has_id" : {
      "form_id" : [ "form_id" ],
      "selected_webform" : { "value" : { "webform-client-form-730" : "webform-client-form-730" } }
    }
  }
],
"DO" : [
  { "entity_create" : {
      "USING" : {
        "type" : "node",
        "param_type" : "newsfrommembers",
        "param_title" : "[data:title_member_news-value-raw]",
        "param_author" : [ "user" ]
      },
      "PROVIDE" : { "entity_created" : { "entity_created" : "Created entity" } }
    }
  }
]

Что мне нужно сделать, так это использовать остальные поля веб-формы для переноса информации, например, основной текст и изображение.

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

"param_body" : "[data:body]"

В действии entity_create, однако, когда я импортировал отредактированный текст, он просто исчез, поэтому я предполагаю, что мне нужно добавить отдельное действие для добавления переменных сущности.

Я вернулся к использованию меню и снова не смог заставить его работать. Должно быть, я делаю что-то в корне неправильное.

Author: kiamlaluno, 2016-05-02

1 answers

1-я попытка

Перед использованием действия правил, такого как "Установить значение данных" для вашего поля a, вы должны убедиться, что добавили условие правил Entity has field (связанное с полем, для которого вы хотите установить значение). И обязательно добавьте это условие Entity has field ПЕРЕД другими Условиями правил, в которых вы, возможно, захотите сослаться на это поле.

Это также упоминается в пользовательском интерфейсе правил, например, когда вы добавляете условие "сравнение данных": где-то написано " Селектор данных помогает вам детализировать данные, доступные для правил. Чтобы поля сущности отображались в селекторе данных, вам, возможно, придется использовать условие "у сущности есть поле" (или "содержимое имеет тип')".

Вышесказанное относится к любому из ваших "... остальные поля в веб-форме" (как в вашем вопросе).

Для видеоурока, иллюстрирующего важность этого условия Entity has field, обратитесь к Типам данных и выбору данных, особенно к тому, что показано между примерно 13:30 и 17:30 в нем.

2-я попытка

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

Давайте предположим, что у меня есть веб-форма, созданная с некоторыми его полей с именами машин, такими как:

  • contact_us_first_name.
  • contact_us_last_name.
  • contact_us_subject.

После добавления этих полей (с одинаковыми именами машин) в любую из ваших собственных форм вы сможете импортировать прототип -правило ниже (с использованием пользовательского интерфейса правил) в вашей собственной среде (без ограничения целостности):

{ "rules_create_a_node_from_a_submitted_webform" : {
    "LABEL" : "Create a node from a submitted webform",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules", "webform_rules" ],
    "ON" : { "webform_rules_submit" : [] },
    "IF" : [
      { "user_has_role" : { "account" : [ "user" ], "roles" : { "value" : { "2" : "2" } } } }
    ],
    "DO" : [
      { "drupal_message" : { "message" : "The webform component submitted by [data:contact_us_first_name-value] (= [data:contact_us_first_name-title]) [data:contact_us_last_name-value] (= [data:contact_us_last_name-title]) contains a field labeled \u0022[data:contact_us_subject-title]\u0022 which has value \u0022[data:contact_us_subject-value]\u0022." } }
    ]
  }
}

В приведенное выше правило я включил дополнительное условие Правил, чтобы предотвратить выполнение действия Правил для анонимные пользователи (не стесняйтесь изменять идентификатор роли или просто удалять это условие правил. И правило запускается с помощью события правил "После отправки веб-формы".

Действие "Правила" отображает (информационное) сообщение на сайте (мой рекомендуемый способ написания и отладки правил...) только после отправки веб-формы. Вот что я указал (в пользовательском интерфейсе правил) в качестве отображаемого сообщения:

Компонент веб-формы, представленный [данные: contact_us_first_name-значение] (= [данные: contact_us_first_name-название]) [данные:contact_us_last_name-значение] (= [данные:contact_us_last_name-название]) содержит поле с надписью "[данные:contact_us_subject-название]", которое имеет значение "[данные:contact_us_subject-значение]".

Вот пример сообщения, показанного в моей собственной настройке:

Компонент веб-формы, представленный Dries (= Имя:) Buytaert (= Фамилия:) содержит поле с надписью "Тема:", которое имеет значение "Ходят слухи, что модуль правил может даже заменить модуль node_convert! ".

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

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

3-я попытка

Вышесказанное - хорошее начало, но все же недостаточное для достижения вашей цели (="... используйте остальные поля веб-формы для переноса информации, например, основной текст...", как в вашем вопросе). Однако вы можете использовать метод, аналогичный описанному в моем ответе на " Как выполнить сравнение данных с представленными данными веб-формы при использовании модуля правил?". Для коротко:

  • Добавьте дополнительное действие правил в Add a variable (для каждого из компонентов веб-формы для переноса информации, с присвоенным ему значением, равным вашему [data:ComponentName-value-raw] (и с типом данных, который равен типу данных вашего компонента веб-формы).
  • В своих последующих действиях с правилами вы можете ссылаться на значение этих переменных, которые вы только что добавили (это ключ к разгадке!).

Демонстрационная версия

Компоненты веб-формы

Предположим, что веб-форма с form_id=191 и с эти компоненты веб-формы:

  • Метка =Заголовок, Имя машины = demoform_title, Тип данных = Текстовое поле.
  • Метка = Текст, Имя машины = demoform_text, Тип данных = Текстовая область.
  • Метка =Номер, Имя машины = demoform_number, Тип данных = Номер.
  • Метка = Опция, Имя машины = demoform_option, Тип данных = Выбор параметров (одно значение).

Тип содержимого статьи

Предположим, что тип содержимого статьи содержит следующие поля:

  • Метка =Название, Имя машины= title, Тип поля = элемент модуля узла.
  • Метка = Тело, Имя машины = body, Тип поля = Длинный текст и сводка.
  • Метка = Номер свободного формата, Имя машины = field_free_format_nr, Тип поля = Целое число.
  • Метка = Список опций, Имя машины = field_optionlist, Тип поля = Список(текст).

Пользовательское правило

Вот пользовательское правило (в формате экспорта правил), которое является расширенной (улучшенной) версией правила, включенного в вопрос. Это правило создаст новый узел (из введите Article), и который будет использовать данные, включенные в вышеупомянутые компоненты веб-формы:

{ "rules_create_a_node_from_webform_data" : {
    "LABEL" : "Create a node from webform data",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "webform_rules", "rules" ],
    "ON" : { "webform_rules_submit" : [] },
    "IF" : [
      { "webform_has_id" : {
          "form_id" : [ "form_id" ],
          "selected_webform" : { "value" : { "webform-client-form-191" : "webform-client-form-191" } }
        }
      }
    ],
    "DO" : [
      { "drupal_message" : { "message" : "The webform submitted contains these fields:\r\n\u003C\/ul\u003E\r\n\u003Cli\u003Ethe field labeled \u0022[data:demoform_title-title]\u0022 which has value \u0022[data:demoform_title-value-raw]\u0022.\u003C\/li\u003E\r\n\u003Cli\u003E the field labeled \u0022[data:demoform_text-title]\u0022 which has value \u0022[data:demoform_text-value-raw]\u0022.\u003C\/li\u003E\r\n\u003Cli\u003E the field labeled \u0022[data:demoform_number-title]\u0022 which has value \u0022[data:demoform_number-value-raw]\u0022.\u003C\/li\u003E\r\n\u003Cli\u003E the field labeled \u0022[data:demoform_option-title]\u0022 which has value \u0022[data:demoform_option-value-raw]\u0022.\u003C\/li\u003E\r\n\u003C\/ul\u003E" } },
      { "variable_add" : {
          "USING" : { "type" : "text", "value" : "[data:demoform_text-value-raw]" },
          "PROVIDE" : { "variable_added" : { "var_demoform_text" : "Form variable text" } }
        }
      },
      { "variable_add" : {
          "USING" : { "type" : "text", "value" : "[data:demoform_number-value-raw]" },
          "PROVIDE" : { "variable_added" : { "var_demoform_number_text" : "Form variable number text" } }
        }
      },
      { "data_convert" : {
          "USING" : { "type" : "integer", "value" : [ "var-demoform-number-text" ] },
          "PROVIDE" : { "conversion_result" : { "var_demoformvar_number" : "Form variable number" } }
        }
      },
      { "variable_add" : {
          "USING" : { "type" : "text", "value" : "[data:demoform_option-value-raw]" },
          "PROVIDE" : { "variable_added" : { "var_demoform_option" : " Form variable option" } }
        }
      },
      { "entity_create" : {
          "USING" : {
            "type" : "node",
            "param_type" : "article",
            "param_title" : "[data:demoform_title-value-raw]",
            "param_author" : [ "user" ]
          },
          "PROVIDE" : { "entity_created" : { "article_created" : "Created article" } }
        }
      },
      { "data_set" : {
          "data" : [ "article-created:body:value" ],
          "value" : [ "var-demoform-text" ]
        }
      },
      { "data_set" : {
          "data" : [ "article-created:field-free-format-nr" ],
          "value" : [ "var-demoformvar-number" ]
        }
      },
      { "data_set" : {
          "data" : [ "article-created:field-optionlist" ],
          "value" : [ "var-demoform-option" ]
        }
      },
      { "data_set" : { "data" : [ "article-created:comment" ], "value" : "0" } },
      { "entity_save" : { "data" : [ "article-created" ], "immediate" : "1" } },
      { "drupal_message" : { "message" : "A new article got created, with nid=[article-created:nid] and url=[article-created:url]" } }
    ]
  }
}

Некоторые дополнительные сведения о действиях Правил, которые были добавлены:

  • Show a message on the site: Это только для целей отладки/демонстрации (удалите его, если он вам больше не нужен/не нужен). Вот пример сообщения, которое отображается после отправки веб-формы:

    Отправленная веб-форма содержит следующие поля:

    • поле с надписью "Название" который имеет значение "Какое-то интересное название моей веб-формы".
    • поле с надписью "Текст", которое имеет значение "Просто какой-то текст, с некоторым дополнительным текстом и еще одной строкой и еще одной".
    • поле с надписью "Число", имеющее значение "842316".
    • поле с надписью "Опция", имеющее значение "A".
  • Add a variable ( дважды): Чтобы сделать значение компонентов веб-формы demoform_number и demoform_option доступным в последующих действиях Правил. Обратите внимание, что для demoform_number дополнительное действие правил Convert data type необходимо, чтобы заставить его работать.

  • Set a data value (3 времена): Для заполнения тела узла и 2 полей узла, используя переменные, созданные в предшествующем действии Правил.

  • Set a data value: Чтобы установить "Комментарии закрыты" для создаваемого узла (это необязательное действие правил, просто иллюстрация других вещей, которые вы можете сделать с таким узлом созданный).

  • Save entity: Чтобы фактически сохранить узел.

  • Show a message on the site: Это только для целей отладки/демонстрации (удалите его, если он вам больше не нужен/не нужен). Вот пример сообщения, которое отображается после отправки веб-формы:

    Создана новая статья с nid=123 и url=http://www.example.com/node/123

Конечный результат

После отправки веб-формы с данные как и в приведенном выше примере, была создана новая статья (с идентификатором узла = 123), и с этими сведениями об этом узле:

  • Название : Какое-то интересное название моей веб-формы
  • Тело:

    Просто немного текста,

    С некоторым дополнительным текстом

    И еще одна строка

    И еще один

  • Свободный Формат Nr: 842316

  • Список опций : Дополнительно (метка, соответствующая значению ключа "A")

Дополнительные возможности

С некоторыми дополнительными уточнениями вышеупомянутое правило-прототип также может быть использовано для создания альтернативы на основе правил для модуля Преобразования узлов... и, похоже, у него также есть потенциал для создания аналогичного эквивалента Преобразования сущности .

 4
Author: Pierre.Vriens, 2017-12-04 12:14:14