как создать форму выбора цепочки в cakephp

Мое приложение бизнес-каталога требует 3 связанных поля выбора, и я использую cakephp для создания этого приложения.

Иерархия и порядок выбора разделов таковы:

1 - бизнес-группа

2 - бизнес-тип

3 - город (входит в таблицу заказчика)

Отношения:

  • типы бизнеса клиента HABTM

  • бизнес-группы имеют много типов бизнеса

  • типы бизнеса имеют одну бизнес-группу, клиенты HABTM

Я искал плагины jquery, которые помогают в этом, и нашел один от Remy Sharp, но у него нет более сложных отношений, которые есть у меня. http://remysharp.com/2007/09/18/auto-populate-multiple-select-boxes/

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

Чего я не знаю, так это того, как структурировать действие поиска на основе прослушивателя событий.

Любые советы или я далеко от базы?

Как всегда, я прихожу к колодцу за помощью.

Очень признателен. Павел


Большое спасибо, Ник, я прочитал много ваших сообщений, я очень ценю ваш ответ.

Я следовал вашим инструкциям, но столкнулся с проблемами. Я изо всех сил пытался их решить, но так и не понял.

Вот что я сделал до сих пор:

1) создал «связанные» действия как в business_type, так и в business_directory (переименовал клиента в бизнес-каталог, что более уместно).

связанное действие бизнес-типа:

function chained($business_group_id) {
    $business_types = $this->BusinessType->find('list', array(
        'conditions' => array( 'BusinessType.business_group_id' => $business_group_id)
        ));

         $this->set('business_types', $business_types);
     }

связанное действие бизнес-каталога:

function chained($business_type_id) {
    $business_directories = $this->BusinessDirectory->bindModel(array( 'hasOne' => array('business_directories_business_types' )));         
    $business_directories = $this->BusinessDirectory->find('all', array(
        'fields' => array( ' BusinessDirectory.city'),
        'conditions' => array( 'business_directories_business_types.business_type_id' => $business_type_id)
        ));
            $this->set('business_directories', $business_directories);
     }

Я обнаружил, что с отношением HABTM использование поиска «список» не создает запрос на соединение, тогда как поиск «все» создает.

2) Затем я создал действие поиска в бизнес-каталоге и соответствующее представление.

Для бизнес-групп я создал действие getList для заполнения списка опций в форме поиска:

function getList() {
     return $this->BusinessGroup->find('list');
}

В представлении поиска я добавил javascript для выбора цепочки:

<script type="text/javascript">
<!--
$(function () {
    var group = $('#businessGoup');
    var type = $('#businessType');
    var city = $('#businessDirectoryCity');

    type.selectChain({
        target: city,
        url:  '../business_directories/chained/'+$(this).val(),
  data: { ajax: true, anotherval: "anotherAction" }
    });

    group.selectChain({
        target: type,
        url: '../business_types/chained/'+$(this).val()   
    }).trigger('change');

});
//-->
</script>

И форма:

create('business_directories', array('action'=>'/search_results')); ?> input('business_group_id', array( 'type' => 'select', 'id' => 'businessGoup', 'empty' => '-- Select Business Group --', 'multiple' => true, 'options' => $this->requestAction('/business_groups/getList' ), 'label' => 'Business Group')); ?> input('business_type.id', array( 'type' => 'select', 'id' => 'businessType', 'empty' => '-- Select Business Type --', 'multiple' => true, 'options' => 'none selected', 'label' => 'Business Type')); ?> input('business_directories.id', array( 'type' => 'select', 'id' => 'businessDirectoryCity', 'empty' => '-- Select City --', 'multiple' => true, 'options' => 'options', 'label' => 'City')); ?> end('Search'); ?>

Когда я тестирую функцию цепочки бизнес-типов /business_types/chained/1, все работает.

Но когда я тестирую представление поиска, я получаю сообщение об ошибке javascript. Затем, когда я проверяю firebug, я получаю следующие две ошибки:

Предупреждение (2): отсутствует аргумент 1 для BusinessTypesController::chained() [APP\controllers\business_types_controller.php, строка 71]

Примечание (8): Неопределенная переменная: business_group_id [APP\controllers\business_types_controller.php, строка 73]

Любая дополнительная помощь в этом очень ценится.

Спасибо, Пол.


person Paul    schedule 14.09.2010    source источник
comment
Похоже, вы не передали переменные в действии. т. е. функция chained($business_group_id) не имеет параметра $business_group_id, и последует вторая ошибка. С помощью firebug проверьте, какой URL-адрес запускается после выбора элемента. Думаю, это будет что-то вроде: /business_directories/chained/undefined. В вашем коде есть очень плохие практики, но я не буду их обсуждать. Но обязательно попробуйте заменить requestAction на обычную переменную из контроллера. Ведь это список. Надеюсь, вы преобразуете ответ в правильно отформатированную строку, как показано в демо.   -  person Nik Chankov    schedule 29.09.2010


Ответы (1)


Вам нужно иметь 2 действия в контроллерах (business_type и customer).

каждое действие должно выглядеть так. В этом случае для типа бизнеса

function chained($parent_id){
    $business_types = $this->BusinessType->find('list', array('conditions'=>'BusinessType.business_group_id'=>$parent_id));
    $this->set('business_types', $business_types);
}

конечно, вам также нужно просмотреть это действие, которое будет форматировать значения в правильном формате для цепного выбора.

Для бизнес-группы вам нужно показать все значения напрямую, поэтому ajax не требуется.

Действие контроллера клиента аналогично, но вам нужно выбрать города всех связанных клиентов.

Затем с помощью связанного выбора вам нужно установить правильные элементы и установить правильные действия, которые необходимо вызвать.

i.e.:

$('#id-of-the-business-group').selectChain({
    target: $('#id-of-the-business-type-field'),
    url: '/business_types/chained/'+$(this).val()
});
person Nik Chankov    schedule 14.09.2010
comment
Спасибо, Ник. Я добавил некоторые изменения в свой вопрос, чтобы объяснить проблемы, с которыми я столкнулся. Любая помощь очень ценится. - person Paul; 29.09.2010