select2 ajax

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

select2 ajax

Сообщение caHek2x »

Кто работал с Select2

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

<? $init_value1 = $search->getExecutorsLogin(); ?>
<?=$form->field($search, 'executors')->widget(Select2::classname(), [
	'initValueText' => $init_value1,
	'options'       => [
		'placeholder' => 'Введите логин/фио/ид сотрудника ...',
		'multiple'    => true,
	],
	'pluginOptions' => [
		'allowClear'         => true,
		'minimumInputLength' => 1,
		'ajax'               => [
			'url'      => Url::toRoute(["/oper/select2-find"]),
			'dataType' => 'json',
			'data'     => new JsExpression('function(params) { return {q:params.term}; }')
		],
		'escapeMarkup'       => new JsExpression('function (markup) { return markup; }'),
		'templateResult'     => new JsExpression('function(oper) { return oper.find; }'),
		'templateSelection'  => new JsExpression('function (oper) { return oper.login; }'),
	],
	'maintainOrder' => false
]); ?>
все работает замечательно ...
но ... когда надо отобразить с уже какимито значениями происходит беда ...
в $search->executors у меня массив
array(1) { [0]=> string(3) "287" }
в $init_value1
array(1) { [0]=> string(6) "kuzmin" }

все верно ... если заглянуть в страницу которая генерируется то генерирует верный select
<option value="287" selected="">kuzmin</option>

а вот визульное отображение не отображает то что надо ...
https://yadi.sk/i/pEJ23Q3a3JWuta

а должно быть:
https://yadi.sk/i/8U-6mRq93JWvB9
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: select2 ajax

Сообщение Alexum »

Если у вас $search->executors будет в виде массива "287" => "kuzmin", можно попробовать такой вариант:

Подготавливаете массив для options виджета

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

foreach($search->executors as $key=>$value){
	$init_values[$key] = ['selected' => 'selected'];
}  

скармливаете

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

 'options' => ['options' => $init_values],
Только не уверен, что с Ajax вариантом это сработает, т.к. в data изначально пусто. В общем нужно проверить.
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: select2 ajax

Сообщение caHek2x »

Если заглянуть в исходник то из value который передает field в виджет и из моего initValueText он и формирует data ... Что самое забавное select и option он формирует верно ... Как видно на скрине он даже title задаёт ... Чувствую надо лезть в исходники и ручками дописывать рядом с тайтлом что ещё просто значение вывело ... Уж очень кажется что это бага ...
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: select2 ajax

Сообщение Alexum »

Можно попробовать скормить массив со значениями по умолчанию в параметр 'value' виджета, оставит при этом и initValueText.
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: select2 ajax

Сообщение caHek2x »

Так валуе и так туда передается из формы/фиелда ... Продебажил это уже ...
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: select2 ajax

Сообщение caHek2x »

дебаг наше всё ...
нашел в чем беда ... и теперь два пути решения .. или найти как исправить или просто сделать как хотят ...

вообщем ... с сервера мне возвращается структура: id, login, find
find я отображаю в выпадающем списке ...
login отображаю уже в выбранном ... как я и описал:

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

'templateResult'     => new JsExpression('function(oper) { return oper.find; }'),
'templateSelection'  => new JsExpression('function (oper) { return oper.login; }'),
а вот теперь и беда ...
когда я подаю готовое на вход (то есть не через AJAX а именно заполненую модель поиска скармливаю ... ) то у меня отображается пустые блоки из за того что к модулю отображения (в js) приходит вот такая структура:
id:"287"
selected:true
text:"kuzmin"
title:""
далее происходит

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

var template = this.options.get('templateSelection');
который и получает мою ф-цию ... return oper.login
а login в структуре то и нету ... вот и выходит пустота ...

в общем два варианта или я делаю чтоб сервак возвращал не login а text ... что в общем не трудно ... просто не красиво (для моего восприятия) ...
или надо как то прописать что то что скармливается виджету initValueText это login ...

первый вариант если будет неихбежность я и возьму .. .но может ктото пороет со мной и подскажет как скормить виджету что это login ...
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: select2 ajax

Сообщение Alexum »

Вот тут есть вариант с использованием параметра 'processResults' для ajax внутри самого select2.
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: select2 ajax

Сообщение caHek2x »

завтра на работе посмотрю ... пока первое что бросается в глаза и у этого варианта тоже text в templateResult ...
завтра изучу что происходит в processResults
пока тоже сделал text чтоб запустить уже ...
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: select2 ajax

Сообщение Alexum »

caHek2x писал(а): 2017.05.25, 21:39 завтра на работе посмотрю ... пока первое что бросается в глаза и у этого варианта тоже text в templateResult ...
завтра изучу что происходит в processResults
пока тоже сделал text чтоб запустить уже ...
В processResults можно с данными манипулировать перед отправкой в виджет, в примере человек подставляет в text item.username, тебе можно так же подставить item.login.

Собственно в официальной документации к select2 есть такая информация:
My objects use a property other than text for the text that needs to be displayed?
Just like with the id property, Select2 requires that the text that should be displayed for an option is stored in the text property. You can map this property from any existing property using the following JavaScript.

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

var data = $.map(yourArrayData, function (obj) {
  obj.text = obj.text || obj.name; // replace name with the property used for the text
  return obj;
});
Idaho
Сообщения: 58
Зарегистрирован: 2017.04.24, 08:06

Re: select2 ajax

Сообщение Idaho »

caHek2x
Есть ли возможность выложить action из контроллера как пример для этого варианта Select2?
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: select2 ajax

Сообщение caHek2x »

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

public function actionSelect2Find()
{
	if(!Auth::isAuth()) throw new ForbiddenHttpException("У вас нет прав видеть список сотрудников, вы должны быть авторизованны ....");

	$opers = [];
	$q = trim(Yii::$app->request->get('q', ''));
	if(Str::len($q) > 0)
	{
		$q = explode(" ", $q);
		$where = ['AND'];
		foreach($q as $q_)
		{
			$where_and = ['OR'];
			$where_and[] = ['like', 'login', $q_];
			$where_and[] = ['like', 'fio', $q_];
			$where_and[] = ['oper_id' => $q_];
			$where[] = $where_and;
		}

		$opers = Opers::find()->andWhere($where)->select(['oper_id as id', 'login as text', 'fio'])->asArray()->all();
		foreach($opers as $k => $oper)
		{
			$opers[$k]['find'] = Str::select2($oper['fio'], $q)." (".Str::select2($oper['text'], $q).")";
		}
	}
	Yii::$app->response->format = Response::FORMAT_JSON;
	return ['results' => $opers];
}
во вьюшке:

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

<? $init_value = $search->getOpersLogin(); ?>
<?=$form->field($search, 'opers')->widget(Select2::classname(), [
	'initValueText' => $init_value,
	'options'       => [
		'placeholder' => 'Введите логин/фио/ид сотрудника ...',
		'multiple'    => true,
	],
	'pluginOptions' => [
		'allowClear'         => true,
		'minimumInputLength' => 1,
		'ajax'               => [
			'url'      => Url::toRoute(["/oper/select2-find"]),
			'dataType' => 'json',
			'data'     => new JsExpression('function(params) { return {q:params.term}; }'),
		],
		'escapeMarkup'       => new JsExpression('function (markup) { return markup; }'),
		'templateResult'     => new JsExpression('function(oper) { return oper.find; }'),
	],
	'maintainOrder' => true
]);?>
processResults не пришлось использовать ...
Idaho
Сообщения: 58
Зарегистрирован: 2017.04.24, 08:06

Re: select2 ajax

Сообщение Idaho »

Спасибо.
я так понимаю в моделе есть запрос для

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

<? $init_value = $search->getOpersLogin(); ?>
и этот урл должен существовать?

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

Url::toRoute(["/oper/select2-find"])
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: select2 ajax

Сообщение caHek2x »

Idaho писал(а): 2017.06.23, 06:51 и этот урл должен существовать?

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

Url::toRoute(["/oper/select2-find"])
ну да и его экшн я вам скинул
Idaho писал(а): 2017.06.23, 06:51 Спасибо.
я так понимаю в моделе есть запрос для

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

<? $init_value = $search->getOpersLogin(); ?>

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

public function getOpersLogin()
{
	$result = [];
	if(is_array($this->opers))
	{
		$opers = Opers::find()->id($this->opers)->select(['oper_id', 'login'])->asArray()->all();
		$opers = ArrayHelper::map($opers, 'oper_id', 'login');
		foreach($this->opers as $key => $oper_id)
		{
			if(isset($opers[$oper_id])) $result[] = $opers[$oper_id];
			else unset($this->$oper_id[$key]);
		}
	}
	return $result;
}
Idaho
Сообщения: 58
Зарегистрирован: 2017.04.24, 08:06

Re: select2 ajax

Сообщение Idaho »

в базовом варианте все прекрасно работает (но из-за большого списка слишком долго грузит страницу)
но вот беда с аджаксом
запрос на страницу, которая формируется из контроллера с параметров высыпает ошибку

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

{"name":"PHP Fatal Error","message":"Class 'app\\controllers\\Query' not found","code":1,"type":"yii\\base\\ErrorException","file":"D:\\xampp\\htdocs\\allpedigrees\\controllers\\PedigreesController.php","line":160,"stack-trace"
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: select2 ajax

Сообщение caHek2x »

вы походу не импортировали там класс query ...
Ответить