Как запустить правило после добавления нового файла в поле с несколькими значениями?


Работа с 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"
                      }
                    }
                  ]
                }
              ]
            }
          ]
        }
      }
    ]
  }
}
Author: Toki, 2017-09-25

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.

Итак, ключ к тому, чтобы это сработало:

  1. сначала выполните итерацию по всем значениям полей вашего поля неизмененный узел ( чтобы найти удаленные значения).
  2. затем также повторите все значения полей вашего поля измененный узел ( чтобы найти вставленные значения).

Очевидно, что в этом примечании не объясняется, как найти "обновленные" значения. Но подумайте о моем примере сценария: другой способ взглянуть на это заключается в том, что я обновил значение [email protected] до [email protected]. Не уверен, что это полный ответ на ваш вопрос, но признайте, что он уже довольно близок, не так ли?

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

 1
Author: Pierre.Vriens, 2018-04-18 18:42:14

Вот мое собственное решение для запуска правила при добавлении нового файла через поле изображения (связано с модулем сущности файла).

На самом деле, основная идея состоит в том, чтобы исправлять правила с помощью событий файлов (исправление здесь ), чтобы вы могли запускать действия по сохранению нового файла или обновлению существующего (если у вас есть навыки кодирования событий правил в пользовательском модуле, возможно, этот патч не нужен). Имейте в виду, что файл сохраняется как объект, как только он загружается через форму типа контента.

Итак, в моем случае мне также нужно было действовать со встроенными полями (альтернатива сбору полей или другому типу контента для добавления подписей или авторских прав на изображение), и мне нужно создать второе правило, основанное на обновлении "узла узла" (узел, использующий новый файл), чтобы извлечь файл по идентификатору, а затем собрать все данные из встроенных полей файла для моей цели (с использованием токенов).

Кроме того, будьте осторожны с пакетом файлов, чтобы избежать срабатывания правила для любого файла (документа, аудио и т. Д.), Если вы просто нужно действовать, когда добавляется изображение. Поэтому вам, возможно, придется добавить условие к первому правилу (Сущность имеет пакет, здесь файл имеет изображение пакета).

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

Надеюсь, это кому-нибудь поможет.

 0
Author: Toki, 2017-09-28 08:55:27