Was ist der richtige Weg, um die Regeln des vorhandenen Moduls programmgesteuert zu aktualisieren?

8

Ich möchte ein Update für mein benutzerdefiniertes Modul bereitstellen, für das auch einige Regeln bereitgestellt werden hook_default_rules_configuration.

Wie kann ich nun diese vorhandenen Regeln aktualisieren? Kann ich sie erneut importieren? Sie irgendwie überschreiben? Ich kann nichts darüber in der Dokumentation oder einem entsprechenden Haken finden .

Es scheint einen Haken zu geben, um auf Regeln zu reagieren, die aktualisiert werden. Ich denke, es muss eine Möglichkeit geben, Aktualisierungen für benutzerdefinierte Regeln bereitzustellen ...

Zuerst dachte ich, es sei hook_default_rules_configuration_alter, aber es scheint nicht wie erwartet zu funktionieren, da ich nur JSON importieren möchte.

Mit Ansichten kann ich zum Beispiel einfach alle .incDateien laden und über views_save_view wie in dieser Frage speichern - gibt es nicht einen ähnlichen Weg in Regeln?

Alex
quelle

Antworten:

7

Sie können die Regelkonfiguration über die Regel-Benutzeroberfläche exportieren und dann hook_default_rules_configuration_alter () wie folgt implementieren :

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

Ändern Sie einfach die Instanzen von $data['commerce_cart_add_to_cart_message'], um den Namen Ihres Regelcomputers zu verwenden, und ersetzen Sie die Exportzeichenfolge durch Ihre eigene.

Sie können auch rules_import () anstelle von entity_import () verwenden . Beides ist akzeptabel.

Da das Regelmodul Standardregeln aus Code in die Datenbank lädt und sie von da an aus der Datenbank lädt, wird Ihre Überschreibung nicht sofort erfasst. Navigieren Sie dazu zur Benutzeroberfläche für Regeln und setzen Sie die Regel zurück. Es wird auf den Standardcode zurückgesetzt, der Ihre Überschreibung ist.

Um eine Regel programmgesteuert zurückzusetzen, können Sie dies tun (indem Sie den Namen des Regelcomputers erneut ersetzen):

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

Ein Beispiel dafür kann sein, dies während einer Aktualisierungsfunktion für ein benutzerdefiniertes Modul zu tun.

Es scheint, als würde Wring es löschen, aber Löschen und Zurücksetzen sind für Regeln, die vom Code bereitgestellt werden, gleichwertig, da Löschen Löschen aus der Datenbank bedeutet. Wenn dies eine Regel wäre, die über die Benutzeroberfläche erstellt wurde, wäre sie weg. Eine Regel aus dem Code wird jedoch nur aus der Datenbank gelöscht und dann erneut aus dem Code eingelesen.

Leider gibt es derzeit nur Drush-Befehle zum Aktivieren / Deaktivieren von Regeln. Unter https://www.drupal.org/node/2507187 wird eine Funktionsanforderung für einen Befehl zum Löschen / Zurücksetzen angezeigt

Rooby
quelle
Genau das habe ich versucht, aber es schien nicht zu funktionieren. Ich werde es noch einmal versuchen.
Alex
Ich habe am Ende einen Teil über das Zurücksetzen hinzugefügt. Möglicherweise ist das die fehlende Information.
Rooby
interessanter Punkt! Wenn ich meine Regeln in aktualisiere, kann ich die Regeln hook_default_rules_configurationzurücksetzen, sodass alle Aktualisierungen angewendet werden. Das ist klug, aber: Kann ich eine Rücknahme pro Regel erzwingen? kann ich das programmgesteuert machen?
Alex
Ja, ich habe am Ende der Antwort Informationen hinzugefügt.
Rooby
Ich kam zu einem sehr ähnlichen Ergebnis, indem ich mich mit ui.forms.inc, function befasste rules_ui_confirm_operation_apply. Hier können Sie auch aktivieren und deaktivieren. Vielen Dank für Ihre Hilfe! Ich werde ein wenig herumprobieren und Ihre Antwort in einer Minute akzeptieren
Alex
2

Um die Modulregeln programmgesteuert zu aktualisieren, können Sie sie laden und ändern. Beispiel für das Entfernen einer einzelnen Aktion :

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

Wenn es sich um eine einmalige Änderung handelt, fügen Sie sie zu hook_update hinzu.

Siehe: RulesPlugin für API.

Kenorb
quelle