Implementación de servicios AJAX en el hook_menu de Drupal 7
A veces estamos programando un módulo personalizado de Drupal y en un momento dado necesitamos montar un servicio para nuestras peticiones AJAX. En este caso lo podemos hacer todo implementando el hook_menu.
Servicios AJAX en hook_menu
Si por ejemplo queremos recuperar cierta información en formato JSON en la dirección <URL_DRUPAL>/customajax/<PARAMETRO> podemos añadir la siguiente entrada en la implementación del hook_menu de nuestro módulo:
$items['customajax/%'] = array(
'access arguments' => array('access content'),
'page callback' => 'custom_get_data',
'page arguments' => array(1),
'type' => MENU_CALLBACK,
'delivery callback' => 'ajax_deliver',
);
Figura 1. Elemento de menú ideal para una petición AJAX
Del código anterior podemos destacar la propiedad "type" definida como MENU_CALLBACK y también la propiedad "delivery callback" que en estos casos puede tomar los valores de "ajax_deliver" o bien "drupal_json_output". A continuación analizamos las diferencias entre las dos opciones:
- Opción ajax_deliver: Retorna la información, pero dentro de la función custom_get_data tendremos que llamar explícitamente a la función json_encode para codificar los resultados con JSON. El resultado de la petición contendrá información irrelevante.
- Opció drupal_json_output: Automáticamente procesa los resultados de la función custom_get_data con un json_encode. El resultado de la petición sólo contiene la información devuelta por custom_get_data (toda la información es relevante).
A continuación podemos ver un ejemplo funcional con las dos opciones implementadas:
<?php
/**
* Implements hook_menu().
*/
function custom_ajax_callback_menu() {
$items = array();
$items['customajax/%'] = array(
'access arguments' => array('access content'),
'page callback' => 'custom_get_data',
'page arguments' => array(1),
'type' => MENU_CALLBACK,
'delivery callback' => 'ajax_deliver',
);
$items['customajax_autojson/%'] = array(
'access arguments' => array('access content'),
'page callback' => 'custom_get_data_auto',
'page arguments' => array(1),
'type' => MENU_CALLBACK,
'delivery callback' => 'drupal_json_output',
);
return $items;
}
function custom_get_data($param) {
return json_encode(array('a' => '1', 'b' => '2'));
}
function custom_get_data_auto($param) {
return array('a' => '1', 'b' => '2');
}
Figura 2. Implementación de dos servicios web de ejemplo
Comparte este artículo