Qual é a maneira correta de atualizar as regras do módulo existente programaticamente?

8

Desejo fornecer uma atualização para o meu módulo personalizado, que também possui algumas regras fornecidas via hook_default_rules_configuration.

Agora, como posso atualizar essas regras existentes? Posso reimportá-los? Substituí-los de alguma forma? Não consigo encontrar nada sobre isso no documentário ou em um respectivo livro .

Parece haver um gancho para responder às regras que estão sendo atualizadas, então acho que deve haver uma maneira de fornecer atualizações para regras personalizadas ...

No começo, eu pensei que era hook_default_rules_configuration_alter, mas não parece funcionar como o esperado, já que eu só quero importar JSON.

Por exemplo, usando modos de exibição, posso simplesmente carregar todos os .incarquivos e salvá-los views_save_view como nesta pergunta - não existe uma maneira semelhante nas regras?

Alex
fonte

Respostas:

7

Você pode exportar a configuração de regras por meio da UI de regras e implementar hook_default_rules_configuration_alter () assim:

/**
 * 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" ] } }
        ]
      }
    }');
  }
}

Apenas altere as instâncias de $data['commerce_cart_add_to_cart_message']para usar o nome da máquina de regras e substitua a sequência de exportação pela sua.

Você também pode usar rules_import () em vez de entity_import () . Qualquer um é aceitável.

Como o módulo de regras carrega regras padrão do código no banco de dados e, a partir de então, as carrega do banco de dados, ele não capta imediatamente sua substituição. Para fazer isso, navegue até a interface do usuário de regras e reverta a regra. Ele voltará ao código padrão, que será sua substituição.

Para reverter programaticamente uma regra, você pode fazer isso (substituindo novamente o nome da máquina de regras):

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

Um exemplo de uso disso pode ser fazê-lo durante uma função de atualização para um módulo personalizado.

Pode parecer difícil excluí-lo, mas excluir e reverter são equivalentes às regras fornecidas pelo código, porque excluir significa excluir do banco de dados. Se essa fosse uma regra criada por meio da interface do usuário, ela desapareceria; no entanto, uma regra do código será excluída do banco de dados e lida novamente a partir do código.

Infelizmente, atualmente existem apenas comandos drush para ativar / desativar regras. Há uma solicitação de recurso para um comando de exclusão / reversão em https://www.drupal.org/node/2507187

rooby
fonte
foi exatamente isso que tentei, mas não pareceu funcionar. Vou tentar outra vez.
Alex
Eu adicionei uma parte no final sobre a reversão. Possivelmente essa é a informação que falta.
ROOBY
ponto interessante! por isso, quando atualizo minhas regras, hook_default_rules_configurationposso revertê-las para que quaisquer atualizações sejam aplicadas. isso é inteligente, mas: posso forçar uma reversão por regra? posso fazer isso programaticamente?
Alex4
Sim, eu adicionei informações na parte inferior da resposta.
rooby 4/08/15
Cheguei a uma conclusão muito semelhante ao examinar a função ui.forms.inc rules_ui_confirm_operation_apply. Aqui você também pode ativar e desativar. Obrigado pela sua grande ajuda! Vou tentar em torno de um pouco e aceitar a sua resposta em um minuto
Alex
2

Para atualizar as regras do módulo programaticamente, você pode carregá-las e alterá-las. Exemplo de remoção de ação única :

$rule = rules_config_load("some_rule");
foreach ($rule->actions() as $action) {
  if (strpos($action->getPluginName(), 'drupal_message') !== FALSE) {
    $action->delete();
  }
}
$rule->save();

Se for uma alteração única, adicione-a em hook_update.

Consulte: RulesPlugin para API.

kenorb
fonte