Содержание DropDown в зависимости от нескольких других значений DropDown

Я снова Я видел много тем, в которых спрашивали, как создавать выпадающие списки с содержанием, зависящим от другого значения выпадающего списка. Эта логика работает и для меня. Но теперь у меня есть проблема, что содержание раскрывающегося списка зависит от выбора / значения 2 других раскрывающихся списков. Код для зависимости от одного Dropdown будет выглядеть так:

$form = $crud->form;

$dd1 = $form->addField('dropdown', 'color', 'Color');
$dd1->setValueList(array('1' => 'white', '2' => 'black'));
$dd1->setEmptyText('all');

$dd2 = $form->addField('dropdown', 'size', 'Size');
$dd2->setValueList(array('1' => 'small', '2' => 'normal', '3' => 'large'));
$dd2->setModel('Size');

$dd3 = $form->getElement('packaging_id');

if ($_GET['color']) {
    $dd3->model->addCondition('color', $_GET['color']);
}

if ($_GET['size']) {
    $dd3->model->addCondition('size', $_GET['size']);
}

$dd1->js('change',
    $form->js()->atk4_form('reloadField', 'packaging_id',
        array($this->api->url(), 'color' => $dd1->js()->val())
    )
);

$dd2->js('change',
    $form->js()->atk4_form('reloadField', 'packaging_id',
        array($this->api->url(), 'size' => $dd2->js()->val())
    )
);

С этим кодом выпадающий dd3 будут заполнены пакетами, которые соответствуют "размеру" ИЛИ опции "цвета". Но мне нужно, чтобы выпадающий dd3 будет заполнен пакетами, которые соответствуют параметрам "size" и "color" (например, "small" и "black"). Я думаю, мне нужен способ достижения значений из обоих выпадающих dd1 а также dd2 и поместите его в аргумент $_GET 'reloadField'. Затем извлеките его из $_GET и примените 2 условия. Но я еще не нашел способ. Может кто-нибудь мне помочь? Благодарю.

До свидания...

1 ответ

Решение

Описание

Параметры для atk4_form являются следующие:

->atk4_form($js_method, $param1, $param2, $param3, ...)

Как результат метод JS $js_method от ui.atk4_form.js будет называться так:

->$js_method($param1, $param2, $param3, ...)

Если метод, который вы используете $js_method = 'reloadField'тогда вы можете иметь следующие параметры:

reloadField: function(field_name, url, fn, notrigger, arg)

Таким образом, вы можете передавать аргументы URL одним (или обоими) двумя способами - используя url параметр или использование arg параметр.


Решение

Поэтому одно из этих решений должно работать на вас.

Передайте параметры URL, уже включенные в URL (используя PHP, неправильный подход):

->atk4_form(
    'reloadField',
    'packaging_id',
    $this->api->url(null, array( /* base URL + additional parameters, formatted by PHP */
        'color' => $dd1->js()->val(),
        'size'  => $dd2->js()->val(),
    ))
)

или сгенерируйте URL динамически, используя JS (это правильный путь):

->atk4_form(
    'reloadField',
    'packaging_id',
    $this->api->url(), /* base URL */
    null,
    null,
    array( /* additional parameters formatted by JS */
        'color' => $dd1->js()->val(),
        'size'  => $dd2->js()->val(),
   )
)
Другие вопросы по тегам