Пишу модуль. 3 селекта, первый выводит из словаря термины, второй по термину список нод, третий по ноде - еще один селект, по изменению последнего селекта меняется поле в форме (цена).
С AHAH вроде работать научился. Проблема вот в чем. Когда в первом селекте меняю значения, после этого меняются значения во втором селекте и событие по изменению значения во втором (влияние второго на третий) перестает срабатывать. Если еще пока замена не произведена (поставил заглушку и два варианта выбора) - все нормально (происходит срабатывание).
В чем может быть проблема?
Заранее всем спасибо.
Комментарии
попробуйте часть кода опубликовать
Опубликовать...
Функция, которая "дописывает" часть формы (рабочей). Возвращает её по хуку меню.
{
$simpleform = leasing_reserve_form ();
$simpleform ['leasing_reserve']['#collapsed'] = FALSE;
//Создание новых элементов формы
$result = db_query (" SELECT term_data.name, term_data.tid, COUNT( term_node.nid ) cnt
FROM term_data, term_node
WHERE term_data.tid = term_node.tid
AND term_data.vid =1
AND term_node.nid IN (SELECT id_catalog FROM {leasing_base})
GROUP BY term_data.tid
ORDER BY term_data.name ASC");
while ($obj = db_fetch_object ($result))
$type_items [$obj->tid] = $obj->name." (" . $obj->cnt . ")";
$simpleform ['leasing_reserve']['catalog_items'] = array (//Первый комбик
'#type' => 'select',
'#title' => 'Тип в каталоге',
'#description' => 'Выберите тип из каталога. В скобках указано количество моделей, которые имеются в данной категории',
'#weight' => '-3',
'#options' => array(
'Выберите производителя' => $type_items
),
'#ahah' => array (
'path' => 'leasing/getmodels',
'wrapper' => 'edit-model-items-wrapper',
'event' => 'change'
),
);
$simpleform ['leasing_reserve']['model_items'] = array (//Второй комбик с модельками
'#type' => 'select',
'#title' => 'Модель',
'#description' => 'Выберите модель из каталога. В скобках указано количество имеющихся экземпляров данной модели.',
'#weight' => '-2',
'#options' => array (1 => 'Выберите тип в пункте выше',
2 => 'Выберите тип в пункте выше',),
'#ahah' => array (
'path' => 'leasing/getserials',
'wrapper' => 'edit-serial-items-wrapper',
'event' => 'change'
),
);
$simpleform ['leasing_reserve']['serial_items'] = array (//Третий комбик с сейными номерами
'#type' => 'select',
'#title' => 'Серийный номер',
'#description' => 'Выберите серийный номер. В скобках указана цена.',
'#weight' => '-1',
'#options' => array (1 => 'Выберите тип в пункте выше',
2 => 'Выберите тип в пункте выше', ),
'#ahah' => array (
'path' => 'leasing/getprice',
'wrapper' => 'edit-price-wrapper',
'event' => 'change'
),
);
$newform = $simpleform;
return $newform;
}
Функция - обработчик для AHAH первого комбика (по каталогу - модель)
{
//Участок кода для правильной обрабоки формы
$form_state = array('storage' => NULL, 'submitted' => FALSE);
$form_build_id = $_POST['form_build_id'];
$form = form_get_cache($form_build_id, $form_state);
$args = $form['#parameters'];
$form_id = array_shift($args);
$form['#post'] = $_POST;
$form['#redirect'] = FALSE;
$form['#programmed'] = FALSE;
$form_state['post'] = $_POST;
$form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id);
$file = fopen ("out.txt","w");
$str = serialize ($form);
fprintf ($file,$str);
fclose ($file);
$selectedterm = $form_state['post']['catalog_items'];
$result = db_query ("SELECT node.title, node.nid, COUNT( leasing_base.id_trade ) cnt
FROM node, leasing_base
WHERE node.nid = leasing_base.id_catalog
AND node.nid
IN (
SELECT term_node.nid
FROM term_node
WHERE term_node.tid =%d
)
GROUP BY node.nid" ,$selectedterm);
while ($obj = db_fetch_object ($result))
$model_items [$obj->nid] = $obj->title." (" . $obj->cnt . ")";
/*
$simpleform ['leasing_reserve']['model_items'] = array (//Второй комбик с модельками
'#type' => 'select',
'#title' => 'Модель',
'#description' => 'Выберите модель из каталога. В скобках указано количество имеющихся экземпляров данной модели.',
'#weight' => '-2',
'#options' => array(
'Выберите производителя' => $model_items
),
'#ahah' => array (
'path' => 'leasing/getserials',
'wrapper' => 'edit-serial-items-wrapper',
'event' => 'change'
),
);
*/
$simpleform ['leasing_reserve']['model_items'] = array (//Второй комбик с модельками
'#type' => 'select',
'#title' => 'Модель',
'#description' => 'Выберите модель из каталога. В скобках указано количество имеющихся экземпляров данной модели.',
'#weight' => '-2',
'#options' => array (1 => 'Выберите тип в пункте выше',
2 => 'Выберите тип в пункте выше',),
'#ahah' => array (
'path' => 'leasing/getserials',
'wrapper' => 'edit-serial-items-wrapper',
'event' => 'change'
),
);
$element = drupal_render ($simpleform);
return drupal_json ($element);
return $element;
}
И по модели - серийный номер:
{
//Участок кода для правильной обрабоки формы
$form_state = array('storage' => NULL, 'submitted' => FALSE);
$form_build_id = $_POST['form_build_id'];
$form = form_get_cache($form_build_id, $form_state);
$args = $form['#parameters'];
$form_id = array_shift($args);
$form['#post'] = $_POST;
$form['#redirect'] = FALSE;
$form['#programmed'] = FALSE;
$form_state['post'] = $_POST;
$form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id);
$selectednid = $form_state['post']['model_items'];
$result = db_query ("SELECT * FROM {leasing_base} WHERE catalog_id=%d" ,$selectedterm);
while ($obj = db_fetch_object ($result))
$model_items [$obj->id_trade] = $obj->serual_number." (" . $obj->price . ")";
$simpleform ['leasing_reserve']['serial_items'] = array (//Третий комбик с сейными номерами
'#type' => 'select',
'#title' => 'Серийный номер',
'#description' => 'Выберите серийный номер. В скобках указана цена.',
'#weight' => '-1',
'#options' => array (1 => 'Выберите тип в пункте выше'),
'#ahah' => array (
'path' => 'leasing/getprice',
'wrapper' => 'price-wrapper',
'event' => 'change'
),
);
$element = drupal_render ($simpleform);
return drupal_json ($element);
return $element;
}
На элементы списков (#options) поставлены "заглушки". Но даже при таком стечении обстоятельств проблема остается.
Возможно надо префиксы у динамических элементов прописать и суффиксы типа:
'#suffix' => '</div>';
И метод у ахах элементов типа:
'path' => 'leasing/getprice',
'wrapper' => 'price-wrapper',
'event' => 'change',
'method' => 'replace'
),
Вообще надо посмотреть что в html получается после динамической подгрузки элемента, наверняка с wrapper что-то.
Проблема остается.
Генерится код, в котором лишние
<div> </div>
. Они портят всю картину.Ну так убрать этот
Решено в теме. Еще раз спасибо gorr'у.