Как создать форму выбора цепочки в CakePHP - PullRequest
1 голос
/ 14 сентября 2010

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

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

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

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

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

Отношения:

  • бизнес-типы клиентов HABTM

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

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

Я искал плагины jquery, которые помогают с этим, и нашел один от Реми Шарпа, но у него нет более сложных отношений, которые у меня есть.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);
     }

Iобнаружил, что с отношением HABTM использование find 'list' не создало запрос на соединение, тогда как find 'all' это сделало.

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

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

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

В поиске я добавил javascript для цепочки select:

<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' => '- Выбрать бизнес-группу -', 'множественный' => true,'options' => $ this-> requestAction ('/ business_groups / getList'), 'label' => 'Business Group'));?> input ('business_type.id', array ('type' => 'select', 'id' => 'businessType', 'empty' => '- Выбрать тип бизнеса -', 'множественный' =>true, 'options' => 'none selected', 'label' => 'Business Type'));?> input ('business_directories.id', array ('type' => 'select', 'id' => 'businessDirectoryCity', 'empty' => '- Выбрать город -', 'множественный' => true, 'options' => 'options', 'label' => 'City'));?> end ('Поиск');?>

Когда я тестирую функцию цепочки бизнес-типов / 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]

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

Спасибо, Пол

1 Ответ

2 голосов
/ 14 сентября 2010

Вам нужно иметь 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.

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

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

т.е:.

$('#id-of-the-business-group').selectChain({
    target: $('#id-of-the-business-type-field'),
    url: '/business_types/chained/'+$(this).val()
});
...