Hero

Como garantizar que se incluyan archivos entre llamados Ajax en Drupal 7

Abril 02, 2014

enzo
Drupal
Desarrollo de Modulos

Es muy común que en nuestros formularios intentemos hacer llamados Ajax para dar una mejor experiencia de uso a nuestros usuarios finales, esto lo podemos hacer en formularios propios o quizá por medio de una implementación del hook_form_alter() o hook_form_ID_alter() para agregar nuevas funcionalidades.

Al hacer nuestra funcionalidad, quizá hagamos uso de funciones definidas en otros módulos y que podemos ejecutar haciendo una inclusión del archivo mediantes la función module_load_include() como se muestra a continuación.

 // Load node.admin.inc from the node module.
  module_load_include('inc', 'node', 'node.admin');
  // Load content_types.inc from the node module.
  module_load_include('inc', 'node', 'content_types');

Pero muchas veces simplemente hacemos uso de las funciones porque fueron incluidas en el proceso antes de la generación del formulario y no nos percatamos de que alguien hizo el trabajo por nosotros de incluirlo, bueno al hacer el llamado a ajax es muy probable que ese archivo no incluya porque todo se hacer por el llamado a callback dominio.com/system/ajax y es muy probable que el código que antes se ejecuto e hizo disponible la función que necesitemos pues esta ves en el procesamiento del formulario no este disponible.

Si la ejecución del Drupa.ajax encuentra en un error el comportamiento seria que el llamado se haga , pero no retorne nada al usuario, ni siquiera generando un error 500, pero si miramos el log de error podríamos apreciar un error similar al siguiente.

[02-Apr-2014 16:03:46 UTC] PHP Fatal error:  Call to undefined function node_form_validate() in /home/egarcia/drupal/includes/form.inc on line 1460
[02-Apr-2014 16:03:46 UTC] PHP Stack trace:
[02-Apr-2014 16:03:46 UTC] PHP   1. {main}() /home/egarcia/drupal/index.php:0
[02-Apr-2014 16:03:46 UTC] PHP   2. menu_execute_active_handler() /home/egarcia/drupal/index.php:21
[02-Apr-2014 16:03:46 UTC] PHP   3. call_user_func_array() /home/egarcia/drupal/includes/menu.inc:516
[02-Apr-2014 16:03:46 UTC] PHP   4. ajax_form_callback() /home/egarcia/drupal/includes/menu.inc:516
[02-Apr-2014 16:03:46 UTC] PHP   5. drupal_process_form() /home/egarcia/drupal/includes/ajax.inc:371
[02-Apr-2014 16:03:46 UTC] PHP   6. drupal_validate_form() /home/egarcia/drupal/includes/form.inc:848
[02-Apr-2014 16:03:46 UTC] PHP   7. _form_validate() /home/egarcia/drupal/includes/form.inc:1133
[02-Apr-2014 16:03:46 UTC] PHP   8. form_execute_handlers() /home/egarcia/drupal/includes/form.inc:1400

Por lo tanto debemos antes de renderizar el formulario que sera usado en el llamado ajax , garantizar que la librería que necesitaremos estará disponible durante el llamado Ajax. Lo anterior lo conseguimos llamado a la función form_load_include() como se muestra a continuación.

// Make sure we have necessary includes.
form_load_include($form_state, 'inc', 'node', 'node.pages');

El llamado anterior modificar el formulario en la propiedad $form_state[‘build_info’][‘files’], garantizando que nuestra librería sera incluida incluso durante llamados Ajax, lo que permitirá que la función node_form_validate sea ejecutada sin problemas solucionando el erorr del ejemplo.

Espero que haya sido de su agrado.

Recibe consejos y oportunidades de trabajo 100% remotas y en dólares de weKnow Inc.