пример с Select2 в yii2

Для реализации поля с использованием 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, если участников много. Это гибкое решение, которое улучшает пользовательский интерфейс.