¿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?

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


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.