SilverStripe - получение проверенных значений из модели администратора на основе выбора поля формы

1

У меня есть форма с выпадающим полем, которое содержит список служб. Эти службы отображаются в кадре в зависимости от того, что было введено в "Модель сервиса" администратора.

Выпадающий список:

<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>

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

Теги:
silverstripe

2 ответа

1

Модуль 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();
};
1

Если вы пытаетесь найти местоположения, относящиеся к текущему $this->Locations(), это будет $this->Locations() и вы все равно можете применить свой фильтр, $this->Locations()->filter(array('AcceptingAppointments' => '1'))->map().

Если это больше похоже на живое обновление, вы можете захотеть заглянуть в него. Существует хорошее сообщение в блоге для начала работы с enwine here

  • 0
    Как я могу связать это с функциональностью формы, чтобы, когда я выбираю сервис из выпадающего списка сервисов, выпадающий список местоположений заполнялся соответственно?
  • 0
    Есть также несколько модулей полей формы для SilverStripe, которые используют замыкания для получения значений для одного поля на основе другого. Это может быть хорошей ссылкой. Другим хорошим примером зависимых полей является зависимый выпадающий модуль
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню