[РЕШЕНО] AJAX функция в hook_field_widget_form() не перегружает форму

Главные вкладки

Аватар пользователя muaddip muaddip 15 ноября 2012 в 15:41

Собственно есть задача сделать кастомное поле с AJAX. Проблема схожа с описанной [#80122]здесь[/#]. Решение вроде описанно на орге [##1194484]здесь[/##]. Следовал инструкции но наткнулся на неприятный момент:
AJAX функция срабатывает и передает нужные параметры, вижу через krumo, но элементы формы в поле не перегружает.
Есть догадки в чем может быть дело?

Комментарии

Аватар пользователя muaddip muaddip 15 ноября 2012 в 16:23

Если не лень читать и нужен код, то вот он:

<?php
// hook_field_widget_form 
function custom_select_field_widget_form(&$form, &$form_state$field$instance$langcode$items$delta$element) {
    
$widget $element;
    
$widget['#delta'] = $delta;
    
$field_name $field['field_name'];
    switch (
$instance['widget']['type']) {
        case 
'custom_select_widget':
            
$element['fieldset'] = array(
                
'#type' => 'fieldset',
                
'#delta' => $delta,
                
'#title' => '',
            );
            
            if (isset(
$form_state['values'][$field_name][$langcode][$delta]['fieldset']['first'])) {
                
$values $form_state['values'][$field_name][$langcode][$delta]['fieldset'];
                
$values += array('second' => 'none');
                
$element['fieldset']['test'] = array(
                
'#type' => 'textfield',
                
'#size' => 60,
                
'#maxlength' => 60,
                
'#title' => 'Test AJAX',
                
'#default_value' => 'Test AJAX',
            );
            }
            else {
                
$values = array();
                
$values += array('first' => 'none''second'  => 'none');
            }
            
$parent 0// в первом селекте будут выводится термины без родителя
            
$tid array_values($values);
            
$idvocabulary $field['settings']['terms'];
            for (
$i=0$i<2$i++) {
                
$terms taxonomy_get_tree($idvocabulary$parent1);
                
$tid_i $tid[$i];
                
// Формируем данные для селекта
                
$options = array('none' => '<none>');
                foreach (
$terms as $term) {
                    
$options[$term->tid] = $term->name;
                }
                
// Создаём сам селект
                
if ($i===0) {
                    
$element['fieldset']['first'] = array(
                        
'#type' => 'select',
                        
'#options' => $options,
                        
'#default_value' => $tid_i,
                        
'#title' => $field['settings']['label_first'],
                        
'#ajax' => array(
                            
'callback' => 'custom_select_ajax_callback',
                            
'wrapper' => 'fieldset',
                        ),
                    );
                }
                else {
                    
$element['fieldset']['second'] = array(
                        
'#type' => 'select',
                        
'#options' => $options,
                        
'#default_value' => $tid_i,
                        
'#title' => $field['settings']['label_second'],
                    );
                }
                
$parent = isset($options[$tid_i]) ? $tid_i 'none';
            }
        break;
    }
    return 
$element;
}

/**
 * AJAX callback
 */
function custom_select_ajax_callback($form$form_state) {
  
$field_name $form_state['custom_select']['field_data']['field_name'];
  
$delta $form_state['custom_select']['field_data']['delta'];
  
$langcode $form_state['custom_select']['field_data']['langcode'];
  return 
$form[$field_name][$langcode][$delta]['fieldset'];
}
?>
Аватар пользователя muaddip muaddip 16 ноября 2012 в 17:44

Нашел проблему, я не сделал как в [##1194484]примере[/##]: не передал параметры в $form_state

<?php
$field_name 
$field['field_name'];
    
$field_data = array(
        
'field_name' => $field_name,
        
'langcode' => $langcode,
        
'delta' => $delta,
    );
$form_state['custom_select']['field_data'] = $field_data;
?>

по которым потом построю обратный вызов

<?php
function custom_select_ajax_callback($form$form_state) {
  
$field_name $form_state['custom_select']['field_data']['field_name'];
  
$delta $form_state['custom_select']['field_data']['delta'];
  
$langcode $form_state['custom_select']['field_data']['langcode'];
  return 
$form[$field_name][$langcode][$delta]['second'];
}
?>