Quelle est la bonne façon de mettre à jour par programme les règles du module existant?

8

Je veux fournir une mise à jour pour mon module personnalisé, qui contient également des règles via hook_default_rules_configuration.

Maintenant, comment puis-je mettre à jour ces règles existantes? Puis-je les réimporter? Les remplacer d'une manière ou d'une autre? Je ne trouve rien à ce sujet dans le documentaire ou dans un crochet respectif .

Il semble y avoir un crochet pour répondre aux règles mises à jour, donc je suppose qu'il doit y avoir un moyen de fournir des mises à jour pour les règles personnalisées ...

Au début, je pensais que c'était hook_default_rules_configuration_alter mais cela ne semble pas fonctionner comme prévu car je veux juste importer du JSON.

Par exemple, en utilisant des vues, je peux simplement charger tous les .incfichiers et les enregistrer via views_save_view comme dans cette question - n'y a-t-il pas une manière similaire dans les règles?

Alex
la source

Réponses:

7

Vous pouvez exporter la configuration des règles via l'interface utilisateur des règles, puis implémenter hook_default_rules_configuration_alter () comme ceci:

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

Modifiez simplement les instances de $data['commerce_cart_add_to_cart_message']pour utiliser le nom de votre machine de règles et remplacez la chaîne d'exportation par la vôtre.

Vous pouvez également utiliser rules_import () au lieu de entity_import () . L'un ou l'autre est acceptable.

Étant donné que le module de règles charge les règles par défaut du code dans la base de données et les charge à partir de là, il ne détectera pas immédiatement votre remplacement. Pour ce faire, accédez à l'interface utilisateur des règles et annulez la règle. Il reviendra au code par défaut, qui sera votre remplacement.

Pour annuler une règle par programme, vous pouvez le faire (en remplaçant à nouveau le nom de la machine de la règle):

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

Un exemple d'utilisation de cela peut être de le faire lors d'une fonction de mise à jour pour un module personnalisé.

Il peut sembler wring de le supprimer, mais delete et revert sont équivalents pour les règles fournies par le code car supprimer signifie supprimer de la base de données. S'il s'agissait d'une règle créée via l'interface utilisateur, elle disparaîtrait, mais une règle du code sera simplement supprimée de la base de données, puis relue à partir du code.

Malheureusement, il n'existe actuellement que des commandes drush pour activer / désactiver les règles. Il existe une demande de fonctionnalité pour une commande de suppression / restauration sur https://www.drupal.org/node/2507187

rooby
la source
c'est exactement ce que j'ai essayé mais cela ne semble pas fonctionner. Je vais essayer de nouveau.
Alex
J'ai ajouté une partie à la fin sur le retour. C'est peut-être l'information manquante.
rooby
point intéressant! donc quand je mets à jour mes règles dans hook_default_rules_configurationje peux annuler les règles pour que toutes les mises à jour soient appliquées. c'est intelligent, mais: puis-je forcer un retour par règle? puis-je faire cela par programme?
Alex
Oui, j'ai ajouté des informations au bas de la réponse.
rooby
Je suis arrivé à une conclusion très similaire en examinant ui.forms.inc, function rules_ui_confirm_operation_apply. Ici, vous pouvez également activer et désactiver. Merci pour votre grande aide! Je vais essayer un peu et accepter votre réponse dans une minute
Alex
2

Pour mettre à jour les règles du module par programme, vous pouvez les charger et les modifier. Exemple de suppression d'une seule action :

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

S'il s'agit d'un changement unique, ajoutez-le à hook_update.

Voir: RulesPlugin pour l'API.

kenorb
la source