Кто-нибудь сталкивался с похожей задачей:
Если нажат чекбокс, то для Select2 один URL для аякса. Нет - другой.
Как вариант добавить параметр в запрос. Но тоже непонятно как.
Select2 динамически менять URL
Re: Select2 динамически менять URL
Непонятно как, и главное, совсем непонятно - зачем ) Скорее всего, что-то изначально неправильно пытаетесь сделать, поэтому упёрлись в это.
Re: Select2 динамически менять URL
Есть , скажем , список товаров, у которых есть булево поле "активный". По умолчанию ищем только среди активных товаров. Но если поставить рядом в чекбоксе галочку, то поиск должен вестись по всем товарам. Соответственно, надо или параметр в аякс селект2 как то добавить, или слать запрос на другой экшн.
Что тут непонятного или неправильного?
Что тут непонятного или неправильного?
Re: Select2 динамически менять URL
Это довольно простая логика, она спокойно разруливается в SearchModel без всяких дополнительных экшенов.
Примерно так (при этом Gii сам весь код сгенерирует)
Примерно так (при этом 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;
}
Re: Select2 динамически менять URL
Это не гридвью, простая форма с полем select2 и поиском по аяксу. Соответственно никакого значения enabled передавать не получится. В том и загвоздка. Вопрос как раз был в том, как передавать доп.параметр с фронта, а как там будет на бэке вообще не проблема.
Видимо придется как то использовать оригинальный select2 на js, а не виджет картика.
Видимо придется как то использовать оригинальный select2 на js, а не виджет картика.
Re: Select2 динамически менять URL
Теперь стало понятнее в чём ваша загвоздка )
Ну и здесь не нужно другой экшен делать, достаточно отредактировать код.
Берём вот этот пример из документации за основу: http://demos.krajee.com/widget-details/ ... usage-ajax
Пусть наша галочка зовётся "withDisabled", класс формы "Form", ID формы "w0" (он генерируется, сами найдёте, как его определить).
В параметры виджета добавляем код, который будет на клиенте собирать информацию "галочка нажата" и отдавать вместе с AJAX-запросом:
В экшен добавляем входной параметр "withDisabled" и делаем его обработку:
Ну и здесь не нужно другой экшен делать, достаточно отредактировать код.
Берём вот этот пример из документации за основу: 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'
. '};}')
Код: Выделить всё
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;
}