Select2 динамически менять URL

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
MadHarper
Сообщения: 58
Зарегистрирован: 2016.05.29, 22:30

Select2 динамически менять URL

Сообщение MadHarper »

Кто-нибудь сталкивался с похожей задачей:

Если нажат чекбокс, то для Select2 один URL для аякса. Нет - другой.
Как вариант добавить параметр в запрос. Но тоже непонятно как.
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Select2 динамически менять URL

Сообщение Nex-Otaku »

Непонятно как, и главное, совсем непонятно - зачем ) Скорее всего, что-то изначально неправильно пытаетесь сделать, поэтому упёрлись в это.
MadHarper
Сообщения: 58
Зарегистрирован: 2016.05.29, 22:30

Re: Select2 динамически менять URL

Сообщение MadHarper »

Есть , скажем , список товаров, у которых есть булево поле "активный". По умолчанию ищем только среди активных товаров. Но если поставить рядом в чекбоксе галочку, то поиск должен вестись по всем товарам. Соответственно, надо или параметр в аякс селект2 как то добавить, или слать запрос на другой экшн.
Что тут непонятного или неправильного?
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Select2 динамически менять URL

Сообщение Nex-Otaku »

Это довольно простая логика, она спокойно разруливается в SearchModel без всяких дополнительных экшенов.

Примерно так (при этом Gii сам весь код сгенерирует)

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

public function search($params)
{
    $query = Goods::find();

    // add conditions that should always apply here

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);

    // Здесь мы загружаем в модель значение галочки из данных запроса.
    $this->load($params);

    if (!$this->validate()) {
        // uncomment the following line if you do not want to return any records when validation fails
        // $query->where('0=1');
        return $dataProvider;
    }

    // grid filtering conditions
    
    // Здесь мы выполняем отсев неактивных товаров по галочке
    $query->andFilterWhere([
        'enabled' => $this->enabled,
    ]);

    $query->andFilterWhere(['like', 'title', $this->title]);
    // и т.д.
    
    return $dataProvider;
}
MadHarper
Сообщения: 58
Зарегистрирован: 2016.05.29, 22:30

Re: Select2 динамически менять URL

Сообщение MadHarper »

Это не гридвью, простая форма с полем select2 и поиском по аяксу. Соответственно никакого значения enabled передавать не получится. В том и загвоздка. Вопрос как раз был в том, как передавать доп.параметр с фронта, а как там будет на бэке вообще не проблема.
Видимо придется как то использовать оригинальный select2 на js, а не виджет картика.
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Select2 динамически менять URL

Сообщение Nex-Otaku »

Теперь стало понятнее в чём ваша загвоздка )

Ну и здесь не нужно другой экшен делать, достаточно отредактировать код.

Берём вот этот пример из документации за основу: http://demos.krajee.com/widget-details/ ... usage-ajax

Пусть наша галочка зовётся "withDisabled", класс формы "Form", ID формы "w0" (он генерируется, сами найдёте, как его определить).

В параметры виджета добавляем код, который будет на клиенте собирать информацию "галочка нажата" и отдавать вместе с AJAX-запросом:

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

<?= $form->field($formModel, 'title')->widget(Select2::classname(), [
...
'data' => new JsExpression('function(params) {'
    . 'return {'
    . 'withDisabled:$(\'#w0\').yiiActiveForm(\'find\', \'form-withdisabled\').value,'
    . 'q:params.term'
    . '};}')
В экшен добавляем входной параметр "withDisabled" и делаем его обработку:

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

public function actionGoodsList($q = null, $id = null, $withDisabled = null)
{
    \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    $out = ['results' => ['id' => '', 'text' => '']];

    if (!is_null($q)) {
        $query = new Query;
        $query->select('id, title AS text')
            ->from('goods')
            ->where(['like', 'title', $q])
            ->limit(20);
        $searchOnlyActive = $withDisabled != 1;
        if ($searchOnlyActive) {
            $query->andWhere(['enabled' => 1]);
        }
        $command = $query->createCommand();
        $data = $command->queryAll();
        $out['results'] = array_values($data);
    } elseif ($id > 0) {
        $out['results'] = ['id' => $id, 'text' => Goods::find($id)->title];
    }
    return $out;
}
Ответить