Каков правильный способ программного обновления правил существующего модуля?

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

Теперь, как я могу обновить эти существующие правила? Могу ли я повторно импортировать их? Как-то переопределить их? Я не могу найти что-либо об этом в документальный или соответствующий крючок .

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

Сначала я подумал, что это hook_default_rules_configuration_alter , но он не работает так, как ожидалось, так как я просто хочу импортировать JSON.

Например, используя представления, я могу просто загрузить все файлы .inc и сохранить их через views_save_view как в этом вопросе - разве в правилах нет подобного?

7 голосов | спросил Alex 4 PM000000120000005831 2015, 12:43:58

1 ответ


6

Вы можете экспортировать конфигурацию правил через пользовательский интерфейс правил, а затем реализовать hook_default_rules_configuration_alter () следующим образом:

/**
 * Implements hook_default_rules_configuration_alter().
 */
function MODULENAME_default_rules_configuration_alter(&$data) {
  if (isset($data['commerce_cart_add_to_cart_message'])) {
    $data['commerce_cart_add_to_cart_message'] = entity_import('rules_config', '{ "commerce_cart_add_to_cart_message" : {
        "LABEL" : "Display an Add to Cart message",
        "PLUGIN" : "reaction rule",
        "OWNER" : "rules",
        "TAGS" : [ "Commerce Cart" ],
        "REQUIRES" : [ "rules", "commerce_cart" ],
        "ON" : { "commerce_cart_product_add" : [] },
        "IF" : [
          { "data_is" : { "data" : [ "commerce-order:commerce-nocart" ], "value" : "0" } }
        ],
        "DO" : [
          { "commerce_cart_add_to_cart_message" : { "commerce_product" : [ "commerce-product" ] } }
        ]
      }
    }');
  }
}

Просто измените экземпляры $data['commerce_cart_add_to_cart_message'], чтобы использовать имя машины правил и замените строку экспорта своим.

Вы также можете использовать rules_import () вместо entity_import () . Также приемлемо.

Так как модуль правил загружает правила по умолчанию из кода в базу данных, а затем загружает их из базы данных, он не сразу заберет ваше переопределение. Чтобы сделать это, перейдите к пользовательскому интерфейсу правил и верните правило. Он вернется к коду по умолчанию, который будет вашим переопределением.

Чтобы программно вернуть правило, вы можете сделать это (снова заменив имя машины правил):

if ($rules_config = rules_config_load('commerce_cart_add_to_cart_message')) {
  $rules_config->delete();
}

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

Может показаться, что нужно удалить его, но удаление и возврат эквивалентны для правил, предоставляемых кодом, потому что delete означает удаление из базы данных. Если это было правило, созданное с помощью пользовательского интерфейса, оно исчезнет, ​​однако правило из кода будет просто удаляться из БД и затем снова считываться из кода.

К сожалению, в настоящее время существуют только команды drush для включения /отключения правил. Существует запрос функции для команды delete /revert на https://www.drupal.org/node/2507187

ответил rooby 4 PM00000030000001331 2015, 15:47:13

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132