У меня есть форма с выпадающим полем, которое содержит список служб. Эти службы отображаются в кадре в зависимости от того, что было введено в "Модель сервиса" администратора.
Выпадающий список:
<select id="ServiceReq">
<option value="">Service Requested*</option>
<% if getServiceList %>
<% loop getServiceList %>
<option value="$Name">$Name</option>
<% end_loop %>
<% end_if %>
</select>
Код для модели администрирования службы:
<?php
class Service extends DataObject {
private static $db = array(
'Name' => 'varchar',
);
private static $belongs_many_many = array(
'Locations' => 'Location'
);
public static $summary_fields = array(
'Name' => 'Title',
);
private static $field_labels = array(
'Name'
);
public function getCMSFields() {
$fields = parent::getCMSFields();
if ($this->ID) {
$fields->addFieldToTab('Root.Locations', CheckboxSetField::create(
'Locations',
'Locations',
Location::get()->filter(array(
'AcceptingAppointments' => '1'
))->map()
));
}
return $fields;
}
}
Я хочу сделать это, когда служба выбрана из раскрывающегося списка ServiceReq, я хочу получить все выбранные местоположения из поля поля флажка, расположенного на вкладке "Локаторы модели службы". Эти местоположения затем будут использоваться для заполнения раскрывающегося списка "Местоположения" в форме:
<select id="Location">
<option value="">Location/Hospital</option>
</select>
Я знаю, что мне нужно использовать текущий выбранный идентификатор службы, но я не уверен, как я могу настроить эту функцию, но я теряю информацию о том, как настроить функциональность на стороне сервера для передачи в форму,
Модуль Dependent field drop помогает сделать это красиво и легко.
Ниже приведен пример формы с зависимым выпадающим полем, в котором есть раскрывающееся поле " Service
и поле раскрывающегося списка " Location
указаны местоположения, связанные с этой службой.
public function ServiceForm() {
$locationSource = function($serviceID) {
$service = Service::get()->byID($serviceID);
return $service->Locations()
->filter('AcceptingAppointments', true)
->map('ID', 'Name')->toArray();
};
$servicesField = DropdownField::create(
'Service',
'Service',
Service::get()->map('ID', 'Name')->toArray()
)->setEmptyString('');
$locationsField = DependentDropdownField::create(
'Location',
'Location',
$locationSource
)->setDepends($servicesField);
$form = Form::create($this, 'ServiceForm',
FieldList::create(
$servicesField,
$locationsField
),
FieldList::create(
FormAction::create('processServiceForm', 'Submit')
),
RequiredFields::create(
'Service',
'Location'
)
);
return $form;
}
Сначала у нас есть нормальное выпадающее поле для выбора услуги:
$servicesField = DropdownField::create(
'Service',
'Service',
Service::get()->map('ID', 'Name')->toArray()
)->setEmptyString('');
Затем мы добавляем зависимое выпадающее поле для выбора службы:
$locationsField = DependentDropdownField::create(
'Location',
'Location',
$locationSource
)->setDepends($servicesField);
Функция setDepends
определяет, какое поле привязывает это поле к полю сервисов в этом случае. $locationSource
- это функция, которая будет извлекать местоположения и возвращать массив для используемого поля.
$locationSource = function($serviceID) {
$service = Service::get()->byID($serviceID);
return $service->Locations()
->filter('AcceptingAppointments', true)
->map('ID', 'Name')->toArray();
};
Если вы пытаетесь найти местоположения, относящиеся к текущему $this->Locations()
, это будет $this->Locations()
и вы все равно можете применить свой фильтр, $this->Locations()->filter(array('AcceptingAppointments' => '1'))->map()
.
Если это больше похоже на живое обновление, вы можете захотеть заглянуть в него. Существует хорошее сообщение в блоге для начала работы с enwine here