Expertos en Drupal

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.

Implementación de servicios AJAX en el hook_menu de Drupal 7

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

Artículos Relacionados