web-dev-qa-db-fra.com

Quelle est l'alternative à l'utilisation du module Règles conditionnelles?

Le module Règles conditionnelles permet d'inclure des conditions de règles dans les actions de règles (en utilisant son If/Else constructs), ce que vous ne pouvez pas faire en utilisant uniquement le module Rules . Voici quelques-unes (parmi de nombreuses) questions typiques qui peuvent être résolues en utilisant règles conditionnelles :

Cependant, il existe certains problèmes avec le module Règles conditionnelles , tels que:

  • Il n'a pas encore de fonctionnaire sortie pour D7 .
  • Il n'y a pas beaucoup de documentation à ce sujet (et pas de documentation communautaire).
  • Il existe certains scénarios pour lesquels ce module produit des résultats incorrects.

Existe-t-il une autre solution pour construire une logique Rules équivalente, et qui ne nécessite pas l'utilisation du module Rules Conditional ?

5
Pierre.Vriens

Pour toute règle personnalisée où vous êtes tenté d'utiliser le module Règles conditionnelles , vous pouvez toujours créer des Composants de règles correspondants, avec des Actions de règles similaires à effectuer, mais aussi avec des Conditions de règles supplémentaires équivalentes à toutes les Conditions de règles que vous voudrais inclure en utilisant le module Règles conditionnelles. Ensuite, effectuez ce composant de règles dans vos actions de règles de votre règle d'origine.

Considérez cet exemple de prototype (supposez simplement qu'il s'agit d'une version simplifiée d'une règle plus compliquée avec des actions de règles précédentes comme "Récupérer l'entité par ID", "Définir une variable", etc.):

{ "rules_show_a_message_using_conditional_rules" : {
    "LABEL" : "Show a message using Conditional Rules",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules_conditional", "rules" ],
    "ON" : { "node_delete--page" : { "bundle" : "page" } },
    "DO" : [
      { "CONDITIONAL" : [
          {
            "IF" : { "NOT data_is" : { "data" : [ "node:promote" ], "value" : "1" } },
            "DO" : [
              { "drupal_message" : { "message" : "Bingo ... using \u0022Conditional Rules\u0022 ..." } }
            ]
          }
        ]
      }
    ]
  }
}

Voici son équivalent en utilisant des composants de règles:

{ "rules_show_a_message_using_a_rules_component" : {
    "LABEL" : "Show a message using a Rules Component",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "ON" : { "node_delete--page" : { "bundle" : "page" } },
    "DO" : [ { "component_rules_say_bingo" : { "current_node" : [ "node" ] } } ]
  }
}

Et le composant de règles associé ressemble à ceci:

{ "rules_say_bingo" : {
    "LABEL" : "Say bingo",
    "PLUGIN" : "rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "USES VARIABLES" : { "current_node" : { "label" : "Current node", "type" : "node" } },
    "IF" : [
      { "NOT data_is" : { "data" : [ "current-node:promote" ], "value" : "1" } }
    ],
    "DO" : [
      { "drupal_message" : { "message" : "Bingo ... using a Rules Component instead of \u0022Conditional Rules\u0022 ..." } }
    ]
  }
}

Quelques détails sur l'alternative à l'aide d'un composant de règles:

  • La condition de règles dans la construction de règles conditionnelles est devenue une condition de règles du composant de règles.
  • L'action de règles à effectuer a été déplacée vers une action de règles du composant Règles.
  • La règle d'origine appelle simplement le composant Rules, passant ainsi le nœud à traiter comme paramètre du composant Rules.
  • L'événement de règles dans la règle d'origine est inchangé et s'il y avait eu des conditions de règles supplémentaires dans la règle d'origine, celles-ci seraient également restées inchangées.

Remarque : ce qui précède n'est qu'un "concept", pour illustrer l'élément clé de la solution. Parce que ce prototype ne nécessitait aucune "Récupérer l'entité par ID" (ou "Définir une variable", ou "charger les points utilisateurs actuels") comme action précédente.

6
Pierre.Vriens