Drupal

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.

Drauta agencia digitalDrauta

Implementació de serveis AJAX en el hook_menu de Drupal 7

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

Vols començar un nou projecte amb nosaltres?

Necessites un servei per a la teva web? Descobreix com et podem ajudar i no dubtis en contactar amb nosaltres.