2015-11-20 3 views
0

Я работаю над формой, в которой есть два выпадающих списка: Запрос на обслуживание и местоположения. Всякий раз, когда пользователь выбирает услугу, выпадающий список местоположений должен быть заполнен теми местами, которые были выбраны для этой службы. У меня есть модель администратора для обслуживания и местоположения, и вот один для службы, чтобы показать, как я сопоставляюсь Местам модели данные к нему:SilverStripe - Передача данных с контроллера на html-форму через jQuery.ajax

<?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; 
    } 
} 

Это JQuery связан с выпадающим меню для запрошенной услуги, за которым следует функция Ajax, которая проходит идентификатор на сервер:

SchService.change(function() { 
    if (SchService.val() != "" && SchService.val() != null) { 
    SchLocation.prop('disabled', false); 
    sendServiceId(); 
    } else { 
    SchLocation.prop('disabled', true); 
    } 
}); 

    function sendServiceId(){ 
    var service_data = { 
    serviceid: SchService.find('option:selected').attr('id') 
    }; 
    $.ajax({ 
     type: "POST", 
     url: "/home/getLocationsByService", 
     data: service_data 
    }).done(function (response) { 
     console.log(response); 
    }); 
} 

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

public function getLocationsByService(){ 
    $serviceid = $this->getRequest()->getVar('serviceid'); 
    $service = Service::get()->byId($serviceid); 
    $locations = Service::Locations(); 
    foreach ($locations as $location){ 
     return json_encode($locations);//not sure if this will be needed 
    } 
} 

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

+0

1. Я думаю, что ajax должен иметь параметр «success», в котором будут обрабатываться возвращаемые данные. Кроме того, когда у вас есть цикл foreach и «return» в нем, цикл будет длиться всего 1 оборот, он не будет повторяться, поскольку вы нарушаете его с помощью «return», я бы посоветовал вернуть весь массив ($ location) и обрабатывать его с помощью JS в функции успеха AJAX :) – Marius

ответ

2

Это не может быть ответом вы после этого, но я бы рекомендовал использовать большой модуль для этого вместо ... https://github.com/sheadawson/silverstripe-dependentdropdownfield

Это пример, который предлагает ...

// 1. Create a callable function that returns an array of options for the DependentDropdownField. 
// When the value of the field it depends on changes, this function is called passing the 
// updated value as the first parameter ($val) 
$datesSource = function($val) { 
    if ($val == 'one') { 
     // return appropriate options array if the value is one. 
    } 
    if ($val == 'two') { 
     // return appropriate options array if the value is two. 
    } 
}; 

$fields = FieldList::create(
    // 2. Add your first field to your field list, 
    $fieldOne = DropdownField::create('FieldOne', 'Field One', array('one' => 'One', 'two' => 'Two')), 
    // 3. Add your DependentDropdownField, setting the source as the callable function 
    // you created and setting the field it depends on to the appropriate field 
    DependentDropdownField::create('FieldTwo', 'Field Two', $datesSource)->setDepends($fieldOne) 
); 
+0

Я видел этот плагин, но я не думаю, что это сработает для меня в этом случае. Каждая Служба может иметь свой собственный список мест, а также 30 других услуг. Если мне нужно закодировать каждый из них с собственным выбором сервисов, используя этот плагин, это не спасет меня много времени в конце. –

+0

вы определяете функцию php, которая принимает выбранное значение из одной папки вниз, а затем возвращает параметры для второго. Дело в том, что все вещи ajax написаны для вас, и вы * только * имеете дело с этой одной php-функцией, чтобы сказать «если эта служба выбрана, то эти местоположения будут возвращены» или наоборот в зависимости от ваших точных требований – Barry

+0

Не могли бы вы отредактируйте свой ответ и включите пример? Ссылка только ответы считаются не полезными для stackoverflow и могут быть удалены. – wmk

Смежные вопросы