Marzo 14, 2013
kenneth
En ocasiones debemos realizar ciertas acciones de manera masiva sobre un conjunto de nodos, para este requerimiento Drupal cuenta con el modulo contribuido llamado Views Bulk Operations (V.B.O) el cual nos ofrece una serie de acciones pre-definidas que podemos ejecutar sobre un conjunto de nodos.
Para crear acciones personalizadas V.B.O provee el hook_action_info, para probarlo supondremos el requerimiento: Aumentar en uno el valor del campo ’field_existencia’ para los nodos del tipo de contenido ’Libros‘.
Para llevar a cabo esta tarea realizaremos los siguientes pasos:
1. Implementar el hook_action_info:
Para este ejemplo crearemos un modulo personalizado y lo llamaremos ’acciones_personazalidas’, entonces podremos implementar el hook_action_info de la siguiente manera:
<pre title="Implementar hook_action_info">function acciones_personalizadas_action_info() {
return array(
'acciones_personalizadas_aumentar_uno_existencia_action' => array(
'type' => 'entity',
'label' => t('Aumentar en uno existencia'),
'configurable' => FALSE,
'triggers' => array('any'),
),
);
}
Esto retornara un arreglo asociativo, de ser necesario es posible definir múltiples acciones personalizadas en la misma implementación.
Este arreglo contiene la llave: ’acciones_personalizadas_aumentar_uno_existencia_action’ y este contiene otro arreglo asociativo con la definición de los valores necesarios para crear una nueva acción.
Cuando se agregar una acción es necesario definir el nombre de la acción usando el siguiente patron (separado por el caracter ’_’):
NOMBRE_MODULO + DESCRIPCION + PALABRA_RESERVADA.
Por este motivo nuestra acción se llama:“acciones_personalizadas_aumentar_uno_existencia_action”, siguiendo el patron: ’acciones_personalizadas’ = NOMBRE_MODULO + ’aumentar_uno_existencia’ = DESCRIPCION y ’action’ = PALABRA_RESERVADA.
Para crear una nueva acción en Drupal 7 debemos definirle los valores:
- type: El tipo de objecto que se afectara por esta acción, el nucleo de las acciones cuenta con los siguientes tipos ‘node’, ‘user’, ‘comment’ y ‘system’. En este ejemplo utilizaremos el tipo ‘entity’.
- label: Este sera el nombre que tendra la nueva acción una vez este agregada y por el cual lo podremos seleccionar.
- configurable: Si es valor es FALSE la acción no requiere de configuracion extra, pero si TRUE entonces en el modulo se debe definir las funciones para agregar un formulario, se utilizaria el mismo nombre de la acción y agregandole las palabras reservadas ’_form’, ’_validate’ y ’_submit’. (Si lo hubieramos configurado en TRUE las funciones por agregar se deberian llamar: ’acciones_personalizadas_aumentar_uno_existencia_action_form’, ’acciones_personalizadas_aumentar_uno_existencia_action_validate’ y ’acciones_personalizadas_aumentar_uno_existencia_action_submit’).
- triggers: Un arreglo con los eventos (hooks) que se pueden disparar con esta acción.
2. Definir la acción personalizada.
Una vez definido el hook_action_info(), debemos crear la funcion donde se ejecutara para cada uno de los nodos (entidades) seleccionadas en la acción masiva,
<pre title="Definir accion personzalida">function acciones_personalizadas_aumentar_uno_existencia_action(&$entity, $context = array()){
if($entity->type == 'libros'){
$libro = entity_metadata_wrapper('node', $entity);
$nueva_existencia = $libro->field_existencia->value() + 1;
$libro->field_existencia->set($nueva_existencia);
$libro->save();
}
else{
$message = t('La entidad @titulo no es del tipo Libros, no se puede actualizar', array('@titulo' => $libro->title));
drupal_set_message($message, 'warning');
}
}
Cada uno de los nodos (entidades) que fueron seleccionados para ejecutar la acción de una manera masiva pasaran por esta funcion que representa la acción, este codigo unicamente aumenta en uno el valor del campo ‘field_existencia’.
3. Asignar permisos.
Cuando el hook_action_info() y la acción personalizada esten definidos podemos eventualmente seleccionar esta nueva acción desde la edición de la vista Views Bulk Operations (V.B.O), sin embargo aunque este disponible para agregar los usuarios no la podrán utilizar hasta que se definan los permisos para esta nueva operación a cada rol. Por lo tanto el usuario administrador debera ir hasta la pagina de permisos admin/people/permissions donde encontrara un nuevo permiso asociado a la acción llamada ’Aumentar en uno existencia’ y desde alli definir los permisos a los roles cuales pueden utilizar esta nueva operación.
Espero que esto les sea de mucha ayuda para la creación de acciones masivas personalizadas,
Saludos,