Собственно есть задача сделать кастомное поле с AJAX. Проблема схожа с описанной [#80122]здесь[/#]. Решение вроде описанно на орге [##1194484]здесь[/##]. Следовал инструкции но наткнулся на неприятный момент:
AJAX функция срабатывает и передает нужные параметры, вижу через krumo, но элементы формы в поле не перегружает.
Есть догадки в чем может быть дело?
Комментарии
Если не лень читать и нужен код, то вот он:
<?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, $parent, 1);
$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'];
}
?>
Всех испугало дохрена кода?
up!
Нашел проблему, я не сделал как в [##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'];
}
?>