Как запустить правило после добавления нового файла в поле с несколькими значениями?
Работа с Drupal 7.56, Правилами 2.10, Условными правилами 1.0-beta2 и файловой сущностью 2.4
Я не могу запустить правило при добавлении нового изображения в многозначное поле изображения (связанное с сущностью файла для встроенных полей).
Мне нужно действовать при добавлении нового файла, а также при обновлении существующего файла (каждое изображение имеет встроенные поля для подписи и сведений), но я не могу найти правильный способ построения своего правила?
В конце мне нужно запустить правило, когда новый изображение (файл) добавляется для отправки данных (fid, URL, значения встроенных полей) во внешнюю базу данных, и мне нужно другое правило, когда я обновляю встроенные поля изображения (файла) для обновления внешней базы данных.
У кого-нибудь есть здесь совет?
Уже протестировано: Событие "Перед сохранением содержимого", Условие "Сравнение данных" между обновленным и неизмененным узлом (НЕ равно всегда возвращает значение true...), Правила полей файла модуля...
Связанные:
Используя правила Drupal 7, как реагируйте на загрузку файла и измените поле узла?
Написание пользовательского кода PHP в правилах, чтобы проверить, имеет ли поле файла новое значение
Вот моя последняя попытка (немного измененная для ясности) с простым сообщением на сайте, чтобы проверить, срабатывает ли правило:
{ "rules_image_insert" : {
"LABEL" : "image insert",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [ "rules", "rules_conditional" ],
"ON" : { "node_update--article" : { "bundle" : "article" } },
"IF" : [
{ "entity_has_field" : { "entity" : [ "node" ], "field" : "field_pictures" } }
],
"DO" : [
{ "LOOP" : {
"USING" : { "list" : [ "node:field-pictures" ] },
"ITEM" : { "list_item" : "Current list item" },
"DO" : [
{ "entity_fetch" : {
"USING" : { "type" : "file", "id" : [ "list-item:file:fid" ] },
"PROVIDE" : { "entity_fetched" : { "picture" : "picture" } }
}
},
{ "CONDITIONAL" : [
{
"IF" : { "entity_is_new" : { "entity" : [ "picture" ] } },
"DO" : [
{ "drupal_message" : {
"message" : "NEW picture!!",
"type" : "warning"
}
}
]
}
]
}
]
}
}
]
}
}
2 answers
Для обработки многозначного поля с помощью правил следует использовать завершенный другой подход, связанный с условием правил "Список содержит элемент" (и/или его отрицания).
Взгляните на этот пример правил (в формате экспорта правил), который также обрабатывает многозначное поле, хотя в моем случае это список идентификаторов электронной почты (замените "идентификатор электронной почты" на "изображение" в соответствии с вашим случаем):
{ "rules_verify_updates_to_selected_email_ids" : {
"LABEL" : "Verify updates to selected eMail IDs",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [ "rules_conditional", "rules" ],
"ON" : { "node_update--article" : { "bundle" : "article" } },
"DO" : [
{ "LOOP" : {
"USING" : { "list" : [ "node-unchanged:field-email-addresses" ] },
"ITEM" : { "previous_email_id" : "Previous eMail ID" },
"DO" : [
{ "CONDITIONAL" : [
{
"IF" : { "NOT list_contains" : {
"list" : [ "node:field-email-addresses" ],
"item" : [ "previous-email-id" ]
}
},
"DO" : [
{ "drupal_message" : { "message" : "Value [previous-email-id:value] was removed from the multi value field." } }
]
}
]
}
]
}
},
{ "LOOP" : {
"USING" : { "list" : [ "node:field-email-addresses" ] },
"ITEM" : { "current_email_id" : "Current eMail ID" },
"DO" : [
{ "CONDITIONAL" : [
{
"IF" : { "NOT list_contains" : {
"list" : [ "node-unchanged:field-email-addresses" ],
"item" : [ "current-email-id" ]
}
},
"DO" : [
{ "drupal_message" : { "message" : "Value [current-email-id:value] was added to the multi value field." } }
]
}
]
}
]
}
}
]
}
}
Если вы просто замените имя машины "field-email-addresses
" на "field-pictures
" (до импорт), вы должны иметь возможность поэкспериментировать с этим правилом на своем собственном сайте, чтобы увидеть его в действии.
Вот пример сообщений, которые я получаю при обновлении статьи, и при этом я добавляю еще 1 идентификатор электронной почты и одновременно удаляю существующий идентификатор электронной почты:
Value [email protected] was removed from the multi value field.
Value [email protected] was added to the multi value field.
Итак, ключ к тому, чтобы это сработало:
- сначала выполните итерацию по всем значениям полей вашего поля неизмененный узел ( чтобы найти удаленные значения).
- затем также повторите все значения полей вашего поля измененный узел ( чтобы найти вставленные значения).
Очевидно, что в этом примечании не объясняется, как найти "обновленные" значения. Но подумайте о моем примере сценария: другой способ взглянуть на это заключается в том, что я обновил значение [email protected]
до [email protected]
. Не уверен, что это полный ответ на ваш вопрос, но признайте, что он уже довольно близок, не так ли?
Примечание: В качестве альтернативы использованию модуля Условных правил (как вам также кажется уже делаю), вы также можете переработать соответствующую часть моего примера правил в выполнение эквивалентных компонентов правил. Для получения более подробной информации об использовании компонентов правил вместо Условных правил обратитесь к ответу на " Какова альтернатива использованию модуля Условных правил?".
Вот мое собственное решение для запуска правила при добавлении нового файла через поле изображения (связано с модулем сущности файла).
На самом деле, основная идея состоит в том, чтобы исправлять правила с помощью событий файлов (исправление здесь ), чтобы вы могли запускать действия по сохранению нового файла или обновлению существующего (если у вас есть навыки кодирования событий правил в пользовательском модуле, возможно, этот патч не нужен). Имейте в виду, что файл сохраняется как объект, как только он загружается через форму типа контента.
Итак, в моем случае мне также нужно было действовать со встроенными полями (альтернатива сбору полей или другому типу контента для добавления подписей или авторских прав на изображение), и мне нужно создать второе правило, основанное на обновлении "узла узла" (узел, использующий новый файл), чтобы извлечь файл по идентификатору, а затем собрать все данные из встроенных полей файла для моей цели (с использованием токенов).
Кроме того, будьте осторожны с пакетом файлов, чтобы избежать срабатывания правила для любого файла (документа, аудио и т. Д.), Если вы просто нужно действовать, когда добавляется изображение. Поэтому вам, возможно, придется добавить условие к первому правилу (Сущность имеет пакет, здесь файл имеет изображение пакета).
Наконец, если вам нужно запускать правило только при добавлении изображения для определенного типа контента, я добавил последнее условие к первому правилу (при сохранении нового файла): путь к файлу содержит имя папки, в которой будет храниться ваше изображение. При этом условии Правило будет срабатывать только в том случае, если новое изображение было сохранено в правильном папка, специально предназначенная для поля изображения вашего конкретного типа контента.
Надеюсь, это кому-нибудь поможет.