Для реализации поля с использованием Select2 в Yii2, где можно выбирать нескольких участников, приведу пример. Select2 — это мощный jQuery-плагин, который заменяет стандартные выпадающие списки, добавляя поддержку поиска, множественного выбора и других функций.
1. Установка Select2
В Yii2 можно использовать расширение kartik-v/yii2-widget-select2, которое упрощает интеграцию Select2.Установите его через Composer:
bash
1 | composer require kartik-v/yii2-widget-select2 |
2. Модель
В модели укажите поле participants
как массив, чтобы поддерживать множественный выбор:
php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class YourModel extends \yii\db\ActiveRecord { public static function tableName() { return 'your_table'; } public function rules() { return [ [['participants'], 'safe'], // Разрешаем безопасное сохранение ]; } } |
3. Контроллер
Передайте список участников в представление. Например:
php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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
1 | $model->participants = implode(',', $model->participants); |
При загрузке данных из БД (например, при редактировании записи), преобразуем строку обратно в массив:
php
1 | $model->participants = explode(',', $model->participants); |
6. Пример с AJAX (опционально)
Если список участников большой, можно использовать AJAX-загрузку данных. Для этого в Select2
добавьте ajax
-опцию:
php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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, если участников много. Это гибкое решение, которое улучшает пользовательский интерфейс.