Implementació de serveis AJAX en el hook_menu de Drupal 7
A vegades estem programant un mòdul personalitzat de Drupal i en un moment donat necessitem montar un servei per a les nostres peticions AJAX. En aquest cas ho podem fer tot implementant el hook_menu.
Serveis AJAX a hook_menu
Si per exemple volem recuperar certa informació en format JSON a l'adreça <URL_DRUPAL>/customajax/<PARAMETRE> podem afegir la següent entrada a la implementació del hook_menu del nostre mòdul:
$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. Element de menú ideal per a una petició AJAX
Del codi anterior podem destacar la propietat "type" definida com a MENU_CALLBACK i també la propietat "delivery callback" que en aquests casos pot prendre els valors de "ajax_deliver" o bé "drupal_json_output". A continuació analitzem les diferències entre ambdues opcions:
- Opció ajax_deliver: Retorna la informació però dins la funció custom_get_data haurem de cridar explicitament a la funció json_encode per codificar els resultats amb JSON. El resultat de la petició contindrà informació irrellevant.
- Opció drupal_json_output: Automàticament processa els resultats de la funció custom_get_data amb un json_encode. El resultat de la petició només conté la informació retornada per custom_get_data (tota la informació és rellevant).
A continuació podem veure un exemple funcional amb les dues opcions implementades:
<?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ó de dos serveis web d'exemple
Comparteix aquest article