Как создать форму выбора цепочки в CakePHP
Мое приложение бизнес-каталога требует 3 цепочки выбора, и я использую cakephp для создания этого приложения.
Иерархия и порядок выбора разделов таков:
1 - бизнес группа
2 - тип бизнеса
3 - город (включен в таблицу покупателя)
Отношения:
Типы бизнеса клиента HABTM
бизнес-группы имеют много видов бизнеса
типы бизнеса имеют одну бизнес-группу, клиенты HABTM
Я искал плагины jquery, которые помогают с этим, и нашел один от Реми Шарпа, но у него нет более сложных отношений, которые у меня есть. http://remysharp.com/2007/09/18/auto-populate-multiple-select-boxes/
Я думаю, что происходит, когда первое поле выбора (бизнес-группы) предварительно заполнено, и после того, как выбор сделан, слушатель события отправляет сообщение, которое фильтрует второе поле выбора, и то же самое для третьего.
Чего я не знаю, так это как структурировать поисковое действие на основе прослушивателя событий.
Любой совет или я далеко от базы?
Как всегда, я прихожу к колодцу за помощью.
Очень признателен. Павел
Большое спасибо, Ник, я прочитал много твоих постов, я очень ценю твой ответ.
Я следовал твоим инструкциям, но столкнулся с проблемами. Я старался изо всех сил, чтобы решить их, но не понял это.
Это то, что я сделал до сих пор:
1) создал "цепочечные" действия как в business_type, так и в business_directory (переименован в каталог customer в бизнес, что более подходит).
бизнес-тип цепочки действий:
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 использование 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 действия в контроллерах (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()
});