¿Cuál es la forma correcta de actualizar las reglas del módulo existente mediante programación?

8

Quiero proporcionar una actualización para mi módulo personalizado, que también tiene algunas reglas proporcionadas a través de hook_default_rules_configuration.

Ahora, ¿cómo puedo actualizar esas reglas existentes? ¿Puedo volver a importarlos? ¿Anularlos de alguna manera? No puedo encontrar nada sobre esto en el documental o un gancho respectivo .

Parece que hay un gancho para responder a las reglas que se actualizan, por lo que creo que debe haber una manera de proporcionar actualizaciones para las reglas personalizadas ...

Al principio pensé que era hook_default_rules_configuration_alter pero no parece funcionar como se esperaba ya que solo quiero importar JSON.

Por ejemplo, usando vistas simplemente puedo cargar todos los .incarchivos y guardarlos views_save_view como en esta pregunta , ¿no hay una forma similar en las reglas?

Alex
fuente

Respuestas:

7

Puede exportar la configuración de reglas a través de la interfaz de usuario de reglas y luego implementar hook_default_rules_configuration_alter () de esta manera:

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

Simplemente cambie las instancias de $data['commerce_cart_add_to_cart_message']para usar el nombre de su máquina de reglas y reemplace la cadena de exportación por la suya.

También puede usar rules_import () en lugar de entity_import () . Cualquiera de los dos es aceptable.

Como el módulo de reglas carga las reglas predeterminadas del código en la base de datos y, a partir de ese momento, las carga de la base de datos, no recogerá de inmediato su anulación. Para hacerlo, vaya a la IU de reglas y revierta la regla. Volverá al código predeterminado, que será su anulación.

Para revertir mediante programación una regla, puede hacer esto (reemplazando nuevamente el nombre de la máquina de reglas):

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

Un ejemplo de uso de eso puede ser hacerlo durante una función de actualización para un módulo personalizado.

Puede parecer extraño eliminarlo, pero eliminar y revertir son equivalentes para las reglas proporcionadas por el código porque eliminar significa eliminar de la base de datos. Si se tratara de una regla creada a través de la interfaz de usuario, desaparecería, sin embargo, una regla del código simplemente se eliminará de la base de datos y luego se leerá nuevamente desde el código.

Desafortunadamente, actualmente solo hay comandos drush para habilitar / deshabilitar las reglas. Hay una solicitud de función para un comando eliminar / revertir en https://www.drupal.org/node/2507187

robo
fuente
eso es exactamente lo que intenté pero no pareció funcionar. Lo intentaré de nuevo.
Alex
Agregué una parte al final sobre la reversión. Posiblemente esa sea la información que falta.
rooby
punto interesante! así que cuando actualizo mis reglas en hook_default_rules_configurationpuedo revertir las reglas para que se apliquen las actualizaciones. eso es inteligente, pero: ¿puedo forzar una reversión por regla? puedo hacer esto programáticamente?
Alex
Sí, agregué información al final de la respuesta.
rooby
Llegué a una conclusión muy similar mirando ui.forms.inc, function rules_ui_confirm_operation_apply. Aquí también puede habilitar y deshabilitar. ¡Gracias por tu gran ayuda! Probaré un poco y aceptaré tu respuesta en un minuto
Alex
2

Para actualizar las reglas del módulo mediante programación, puede cargarlas y cambiarlas. Ejemplo de eliminación de una sola acción :

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

Si es un cambio de una sola vez, agréguelo a hook_update.

Ver: RulesPlugin para API.

kenorb
fuente