Для реализации поля с использованием Select2 в Yii2, где можно выбирать нескольких участников, приведу пример. Select2 — это мощный jQuery-плагин, который заменяет стандартные выпадающие списки, добавляя поддержку поиска, множественного выбора и других функций.
1. Установка Select2
В Yii2 можно использовать расширение kartik-v/yii2-widget-select2, которое упрощает интеграцию Select2.Установите его через Composer:
bash
composer require kartik-v/yii2-widget-select2
2. Модель
В модели укажите поле participants
как массив, чтобы поддерживать множественный выбор:
php
class YourModel extends \yii\db\ActiveRecord
{
public static function tableName()
{
return 'your_table';
}
public function rules()
{
return [
[['participants'], 'safe'], // Разрешаем безопасное сохранение
];
}
}
3. Контроллер
Передайте список участников в представление. Например:
php
use yii\helpers\ArrayHelper;
use app\models\Participant;
public function actionCreate()
{
$model = new YourModel();
// Получаем список участников
$participants = Participant::find()->select(['id', 'name'])->asArray()->all();
$participantList = ArrayHelper::map($participants, 'id', 'name');
if ($model->load(Yii::$app->request->post())) {
// Преобразуем массив в строку для сохранения в БД
$model->participants = implode(',', $model->participants);
if ($model->save()) {
Yii::$app->session->setFlash('success', 'Данные сохранены!');
return $this->redirect(['view', 'id' => $model->id]);
}
}
return $this->render('create', [
'model' => $model,
'participantList' => $participantList,
]);
}
4. Представление
Используем виджет Select2
для отображения поля с множественным выбором:
php
use kartik\select2\Select2;
use yii\widgets\ActiveForm;
/* @var $this yii\web\View */
/* @var $model app\models\YourModel */
/* @var $participantList array */
$form = ActiveForm::begin();
echo $form->field($model, 'participants')->widget(Select2::class, [
'data' => $participantList, // Список участников
'options' => [
'placeholder' => 'Выберите участников...',
'multiple' => true, // Разрешаем множественный выбор
],
'pluginOptions' => [
'allowClear' => true, // Кнопка очистки
],
]);
echo \yii\helpers\Html::submitButton('Сохранить', ['class' => 'btn btn-success']);
ActiveForm::end();
5. Сохранение и загрузка данных
При сохранении данных из формы значения будут переданы как массив. В контроллере мы преобразуем массив в строку для сохранения в поле SET
:
php
$model->participants = implode(',', $model->participants);
При загрузке данных из БД (например, при редактировании записи), преобразуем строку обратно в массив:
php
$model->participants = explode(',', $model->participants);
6. Пример с AJAX (опционально)
Если список участников большой, можно использовать AJAX-загрузку данных. Для этого в Select2
добавьте ajax
-опцию:
php
echo $form->field($model, 'participants')->widget(Select2::class, [
'options' => [
'placeholder' => 'Выберите участников...',
'multiple' => true,
],
'pluginOptions' => [
'allowClear' => true,
'ajax' => [
'url' => \yii\helpers\Url::to(['participant/search']), // URL для поиска
'dataType' => 'json',
'data' => new \yii\web\JsExpression('function(params) { return {q:params.term}; }'),
],
],
]);
В контроллере создайте действие для поиска участников:
php
public function actionSearch($q = null)
{
$query = Participant::find()
->select(['id', 'name'])
->filterWhere(['like', 'name', $q])
->limit(20)
->asArray()
->all();
$results = [];
foreach ($query as $participant) {
$results[] = ['id' => $participant['id'], 'text' => $participant['name']];
}
return $this->asJson(['results' => $results]);
}
Заключение
Использование Select2 в Yii2 позволяет удобно работать с множественным выбором участников. Вы можете использовать статический список или динамическую загрузку через AJAX, если участников много. Это гибкое решение, которое улучшает пользовательский интерфейс.