Фильтр в связаных моделях

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
YANTARik
Сообщения: 35
Зарегистрирован: 2016.05.26, 13:14
Контактная информация:

Фильтр в связаных моделях

Сообщение YANTARik »

Есть три таблицы: для групп, для установок и для оборудования.
В третью передаются id из первых двух, делая вложенность.
Фильтрация идет:

Код: Выделить всё

 //'groups_id',
            [
                'attribute' => 'groups_id',
                'filter' => Groups::find()->select(['name', 'id'])->indexBy('id')->column(),
                'value' => 'groups.name',
            ],
//'lines_id',
            [
                'attribute' => 'lines_id',
                'filter' => Lines::find()->select(['name', 'id'])->indexBy('id')->column(),
                'value' => 'lines.name',
            ],
Но есть проблема, как отсеять часть записей 'lines_id' после выборки в первом фильтре 'groups_id'?
YANTARik
Сообщения: 35
Зарегистрирован: 2016.05.26, 13:14
Контактная информация:

Re: Фильтр в связаных моделях

Сообщение YANTARik »

Без стороннего модуля никак?
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Фильтр в связаных моделях

Сообщение caHek2x »

Самому делать ajax запрос ... А модуль сделает все за вас ...
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Фильтр в связаных моделях

Сообщение rak »

можно конечно и без стороннего модуля, только по сути его придется самому переписать :)
YANTARik
Сообщения: 35
Зарегистрирован: 2016.05.26, 13:14
Контактная информация:

Re: Фильтр в связаных моделях

Сообщение YANTARik »

народ подскажите где туплю??

пытаюсь настроить модуль от kartik-v

Код: Выделить всё

 // в view\_form.php
$form->field($model, 'groups_id')->dropDownList($List, ['id'=>'groups_id-id']), 

        $form->field($model, 'parent_id')->widget(DepDrop::classname(), [
            'options'=>['id'=>'parent_id-id'],
            'pluginOptions'=>[
                'depends'=>['groups_id-id'],
                'placeholder'=>'Select...',
                'url'=>Url::to(['/site/lines'])
            ]
        ])


// Controller
 public function actionSubLines() {
    $out = [];
    if (isset($_POST['depdrop_parents'])) {
        $parents = $_POST['depdrop_parents'];
        if ($parents != null) {
            $cat_id = $parents[0];
            $out = self::getSubLinesList($parent_id); 
            // the getSubCatList function will query the database based on the
            // cat_id and return an array like below:
            // [
            //    ['id'=>'<sub-cat-id-1>', 'name'=>'<sub-cat-name1>'],
            //    ['id'=>'<sub-cat_id_2>', 'name'=>'<sub-cat-name2>']
            // ]
            echo Json::encode(['output'=>$out, 'selected'=>'']);
            return;
        }
    }
    echo Json::encode(['output'=>'', 'selected'=>'']);
}

 
Получаю ошибку:

Код: Выделить всё

Invalid argument supplied for foreach()
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Фильтр в связаных моделях

Сообщение rak »

и что, прям вот больше ничего кроме этой ошибки? должен же трейс показываться и место в коде, где ошибка
YANTARik
Сообщения: 35
Зарегистрирован: 2016.05.26, 13:14
Контактная информация:

Re: Фильтр в связаных моделях

Сообщение YANTARik »

ну если в кратце:

Код: Выделить всё

n C:\OpenServer\domains\localhost\ss\vendor\yiisoft\yii2\helpers\BaseHtml.php at line 1746
$lines[] = static::tag('option', $promptText, $promptOptions);
        }
 
        $options = isset($tagOptions['options']) ? $tagOptions['options'] : [];
        $groups = isset($tagOptions['groups']) ? $tagOptions['groups'] : [];
        unset($tagOptions['prompt'], $tagOptions['options'], $tagOptions['groups']);
        $options['encodeSpaces'] = ArrayHelper::getValue($options, 'encodeSpaces', $encodeSpaces);
        $options['encode'] = ArrayHelper::getValue($options, 'encode', $encode);
 
        foreach ($items as $key => $value) {
            if (is_array($value)) {
                $groupAttrs = isset($groups[$key]) ? $groups[$key] : [];
                if (!isset($groupAttrs['label'])) {
                    $groupAttrs['label'] = $key;
                }
                $attrs = ['options' => $options, 'groups' => $groups, 'encodeSpaces' => $encodeSpaces, 'encode' => $encode];
                $content = static::renderSelectOptions($selection, $value, $attrs);
                $lines[] = static::tag('optgroup', "\n" . $content . "\n", $groupAttrs);
            } 
и 

in C:\OpenServer\domains\localhost\ss\backend\views\admin\lines\_form.php at line 25
 – yii\widgets\ActiveField::dropDownList(null, ['id' => 'groups_id'])
 <?php $form = ActiveForm::begin(); ?>
     <?= $form->field($model, 'groups_id')->dropDownList($List, ['id'=>'groups_id']), 
 
        $form->field($model, 'parent_id')->widget(DepDrop::classname(), [
            'options'=>['id'=>'parent_id'],
            'pluginOptions'=>[
                'depends'=>['groups_id'],
                'placeholder'=>'Select...',


Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Фильтр в связаных моделях

Сообщение Onotole »

YANTARik писал(а): 2017.02.28, 16:49 ну если в кратце:

Код: Выделить всё

n C:\OpenServer\domains\localhost\ss\vendor\yiisoft\yii2\helpers\BaseHtml.php at line 1746
$lines[] = static::tag('option', $promptText, $promptOptions);
        }
 
        $options = isset($tagOptions['options']) ? $tagOptions['options'] : [];
        $groups = isset($tagOptions['groups']) ? $tagOptions['groups'] : [];
        unset($tagOptions['prompt'], $tagOptions['options'], $tagOptions['groups']);
        $options['encodeSpaces'] = ArrayHelper::getValue($options, 'encodeSpaces', $encodeSpaces);
        $options['encode'] = ArrayHelper::getValue($options, 'encode', $encode);
 
        foreach ($items as $key => $value) {
            if (is_array($value)) {
                $groupAttrs = isset($groups[$key]) ? $groups[$key] : [];
                if (!isset($groupAttrs['label'])) {
                    $groupAttrs['label'] = $key;
                }
                $attrs = ['options' => $options, 'groups' => $groups, 'encodeSpaces' => $encodeSpaces, 'encode' => $encode];
                $content = static::renderSelectOptions($selection, $value, $attrs);
                $lines[] = static::tag('optgroup', "\n" . $content . "\n", $groupAttrs);
            } 
и 

in C:\OpenServer\domains\localhost\ss\backend\views\admin\lines\_form.php at line 25
 – yii\widgets\ActiveField::dropDownList(null, ['id' => 'groups_id'])
 <?php $form = ActiveForm::begin(); ?>
     <?= $form->field($model, 'groups_id')->dropDownList($List, ['id'=>'groups_id']), 
 
        $form->field($model, 'parent_id')->widget(DepDrop::classname(), [
            'options'=>['id'=>'parent_id'],
            'pluginOptions'=>[
                'depends'=>['groups_id'],
                'placeholder'=>'Select...',


Код: Выделить всё

dropDownList(null, ['id' => 'groups_id'])
YANTARik
Сообщения: 35
Зарегистрирован: 2016.05.26, 13:14
Контактная информация:

Re: Фильтр в связаных моделях

Сообщение YANTARik »

Onotole писал(а): 2017.02.28, 16:53

Код: Выделить всё

dropDownList(null, ['id' => 'groups_id'])

ничего не изменилось((
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Фильтр в связаных моделях

Сообщение rak »

YANTARik писал(а): 2017.02.28, 16:57
Onotole писал(а): 2017.02.28, 16:53

Код: Выделить всё

dropDownList(null, ['id' => 'groups_id'])

ничего не изменилось((
это указание на ошибку, а не решение проблемы :)
в переменной $List содержится null, а должен быть массив
YANTARik
Сообщения: 35
Зарегистрирован: 2016.05.26, 13:14
Контактная информация:

Re: Фильтр в связаных моделях

Сообщение YANTARik »

Массив заполнил:

Код: Выделить всё

 $form->field($model, 'groups')->dropDownList(ArrayHelper::map(Groups::find()->all(), 'id', 'name'), ['id'=>'groups_id'])
выпадающий список работает в первом поле, а вторая часть получает вечную загрузку без ошибок...
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Фильтр в связаных моделях

Сообщение Onotole »

YANTARik писал(а): 2017.02.28, 17:51 Массив заполнил:

Код: Выделить всё

 $form->field($model, 'groups')->dropDownList(ArrayHelper::map(Groups::find()->all(), 'id', 'name'), ['id'=>'groups_id'])
выпадающий список работает в первом поле, а вторая часть получает вечную загрузку без ошибок...
В консоль браузера смотрите
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Фильтр в связаных моделях

Сообщение rak »

раз id поменялся, то нужно поменять и в виджете

Код: Выделить всё

'depends'=>['groups_id'],
ну и да, нужно смотреть на возможные ошибки js, что приходит в аякс ответе итп
YANTARik
Сообщения: 35
Зарегистрирован: 2016.05.26, 13:14
Контактная информация:

Re: Фильтр в связаных моделях

Сообщение YANTARik »

Проблема в том, что консоль в браузере без ошибок... вообще...
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Фильтр в связаных моделях

Сообщение rak »

ajax запрос есть при смене группы? что в ответе?
YANTARik
Сообщения: 35
Зарегистрирован: 2016.05.26, 13:14
Контактная информация:

Re: Фильтр в связаных моделях

Сообщение YANTARik »

ajax-запроса нет... даже не знаю что делать...
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Фильтр в связаных моделях

Сообщение rak »

проверить id и depends, там должны быть одинаковые значения
Ответить