Posted by w4lt3r on May 16, 2012 at 11:32pm
Hola, antes que nada agradezco cualquier ayuda que me puedan brindar, les presento mi problema:
He creado un bloque de forma programada y le asigno un formulario como contenido, dicho formulario consta de dos selectores, el primer selector contiene a los continentes y el segundo a los países (este último depende del primero) para lograr está dependencia hice uso de la propiedad #ajax pero por alguna razón el segundo selector no se actualiza y no recibo ningún mensaje de error.
A continuación presento el código del bloque:
<?php
/****
* Implementacion de hook_block_info().
*/
function rc_block_info() {
return array(
'rc-form-filter' => array(
'info' => t('Contenedor de formulario para filtrado de productos.'),
),
);
}
/****
* Implementacion de hook_block_view().
*/
function rc_block_view($delta) {
$block = array();
if($delta == 'rc-form-filter'):
$block['subject'] = null;
$block['content'] = render(drupal_get_form('rc_form_filter'));
endif;
return $block;
}
?>Y esté es el código del formulario junto con la función callback (rc_form_filter_callback) y las funciones que devuelven los valores para las opciones del select:
<?php
/****
* Retorna una array de paises.
*
* @param $tid
* Es el identificador del continente del que se quiere obtener los paises.
* @param $vid
* Es el identificador del del vocabulario que contiene los continentes y paises.
*
* @return
* Un array cuyas llaves son las tid (taxonomy id) del pais y cuyos valores son los nombres de los paises.
*/
function rc_get_countries($vid, $tid) {
$values = array();
if($tid != 0):
$terms_objs = taxonomy_get_tree($vid, $tid, 1);
foreach($terms_objs as $term_obj):
$values[$term_obj->tid] = t($term_obj->name);
endforeach;
endif;
return $values;
}
/****
* Retorna una array de continentes.
*
* @return
* Un array cuyas llaves son las tid (taxonomy id) del continente y cuyos valores son los nombres de los continentes.
*/
function rc_get_continents() {
$vocabulary = taxonomy_vocabulary_machine_name_load('continents_countries');
$terms_objs = taxonomy_get_tree($vocabulary->vid, 0, 1);
$values['vid'] = $vocabulary->vid;
foreach ($terms_objs as $term_obj):
$values['continents'][$term_obj->tid] = t($term_obj->name);
endforeach;
return $values;
}
/****
* Callback function for ajax responds
*/
function rc_form_filter_callback($form, &$form_state) {
return $form['rc-countries'];
}
/****
* Crea un formulario para filtrar por continentes y paises.
*/
function rc_form_filter($form, &$form_state) {
$vocabulary_options = rc_get_continents();
$default_value = isset($form_state['values']['rc-continents']) ? $form_state['values']['rc-continents'] : 0;
$vocabulary_options['continents'][0] = '';
$form['rc-continents'] = array(
'#type' => 'select',
'#prefix' => '<div id="continents">',
'#title' => t('Continente:'),
'#id' => 'continents',
'#options' => $vocabulary_options['continents'],
'#default_value' => 0,
'#suffix' => '</div>',
'#ajax' => array(
'event' => 'change',
'callback' => 'rc_form_filter_callback',
'wrapper' => 'countries-replace',
),
);
$form['rc-countries'] = array(
'#type' => 'select',
'#prefix' => '<div id="countries-replace">',
'#id' => 'countries',
'#title' => t('País'),
'#default_value' => '--',
'#options' => rc_get_countries($vocabulary_options['vid'], $default_value),
'#suffix' => '</div>',
);
return $form;
}
?>