Связанные (иерархические) списки [Решено]

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

Аватар пользователя vitg vitg 8 июля 2010 в 18:25

Пишу модуль. 3 селекта, первый выводит из словаря термины, второй по термину список нод, третий по ноде - еще один селект, по изменению последнего селекта меняется поле в форме (цена).

С AHAH вроде работать научился. Проблема вот в чем. Когда в первом селекте меняю значения, после этого меняются значения во втором селекте и событие по изменению значения во втором (влияние второго на третий) перестает срабатывать. Если еще пока замена не произведена (поставил заглушку и два варианта выбора) - все нормально (происходит срабатывание).
В чем может быть проблема?

Заранее всем спасибо.

Комментарии

Аватар пользователя vitg vitg 8 июля 2010 в 22:39

Опубликовать...

Функция, которая "дописывает" часть формы (рабочей). Возвращает её по хуку меню.

function leasing_page_form ()
{
        $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 первого комбика (по каталогу - модель)

function get_model_items ()
{

        //Участок кода для правильной обрабоки формы
        $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;

}

И по модели - серийный номер:

function get_model_serials ()
{

        //Участок кода для правильной обрабоки формы
        $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) поставлены "заглушки". Но даже при таком стечении обстоятельств проблема остается.

Аватар пользователя gorr gorr 10 июля 2010 в 19:22

Возможно надо префиксы у динамических элементов прописать и суффиксы типа:

'#prefix' => '<div id="edit-serial-items-wrapper">';
'#suffix' => '</div>';

И метод у ахах элементов типа:

'#ahah' => array (
  'path' => 'leasing/getprice',
  'wrapper' => 'price-wrapper',
  'event' => 'change',
  'method' => 'replace'
  ),

Вообще надо посмотреть что в html получается после динамической подгрузки элемента, наверняка с wrapper что-то.