Qual è il modo corretto per aggiornare le regole del modulo esistente a livello di codice?


8

Voglio fornire un aggiornamento per il mio modulo personalizzato, che ha anche alcune regole fornite tramite hook_default_rules_configuration.

Ora, come posso aggiornare quelle regole esistenti? Posso reimportarli? Sovrascriverli in qualche modo? Non riesco a trovare nulla al riguardo nel documentario o in un rispettivo gancio .

Sembra che ci sia un gancio per rispondere alle regole in fase di aggiornamento, quindi suppongo ci debba essere un modo per fornire aggiornamenti per le regole personalizzate ...

All'inizio ho pensato che fosse hook_default_rules_configuration_alter ma non sembra funzionare come previsto poiché voglio solo importare JSON.

Ad esempio, usando le viste posso semplicemente caricare tutti i .incfile e salvarli tramite views_save_view come in questa domanda - non c'è un modo simile nelle regole?

Risposte:


7

È possibile esportare la configurazione delle regole tramite l'interfaccia utente delle regole e quindi implementare hook_default_rules_configuration_alter () in questo modo:

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

Basta modificare le istanze di $data['commerce_cart_add_to_cart_message']utilizzare il nome della macchina della regola e sostituire la stringa di esportazione con la propria.

Puoi anche usare rules_import () invece di entity_import () . O è accettabile.

Poiché il modulo delle regole carica le regole predefinite dal codice nel database e da allora in poi le carica dal database, non prenderà immediatamente il tuo override. Per farlo, vai all'interfaccia utente delle regole e ripristina la regola. Tornerà al codice predefinito, che sarà la tua sostituzione.

Per ripristinare a livello di codice una regola è possibile farlo (sostituendo nuovamente il nome del computer della regola):

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

Un esempio di utilizzo potrebbe essere quello di farlo durante una funzione di aggiornamento per un modulo personalizzato.

Potrebbe sembrare che lo stia cancellando, ma eliminare e ripristinare sono equivalenti per le regole fornite dal codice perché eliminare significa eliminare dal database. Se si trattasse di una regola creata tramite l'interfaccia utente, non verrebbe più utilizzata, tuttavia una regola dal codice verrà eliminata dal DB e quindi riletta dal codice.

Purtroppo al momento esistono solo comandi di trascinamento per abilitare / disabilitare le regole. C'è una richiesta di funzionalità per un comando di cancellazione / ripristino su https://www.drupal.org/node/2507187


questo è esattamente quello che ho provato ma non sembrava funzionare. Ci proverò ancora.
Alex

Ho aggiunto una parte alla fine sul ripristino. Forse quelle sono le informazioni mancanti.
Rooby,

punto interessante! così quando aggiorno le mie regole in hook_default_rules_configurationposso ripristinare le regole in modo che vengano applicati eventuali aggiornamenti. che è intelligente, ma: posso forzare un ripristino per regola? posso farlo a livello di codice?
Alex

Sì, ho aggiunto informazioni in fondo alla risposta.
Rooby

Sono giunto a una conclusione molto simile esaminando la funzione ui.forms.inc rules_ui_confirm_operation_apply. Qui puoi anche abilitare e disabilitare. Grazie per il tuo ottimo aiuto! Proverò un po 'e accetterò la tua risposta tra un minuto
Alex

2

Per aggiornare le regole del modulo a livello di codice è possibile caricarle e modificarle. Esempio di rimozione di una singola azione :

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

Se è una volta sola modifica, aggiungilo in hook_update.

Vedi: RulesPlugin per API.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.