Текстовое поле Yii2 CSV для множественного выбора dropDownList

Существует поле базы данных с именем path, это текстовый тип, и оно используется для хранения строк, обозначающих пути, в виде CSV, что-то вроде следующего:

*:*,site/about,site/* Первоначально оно использовалось как поле ввода текста, как показано ниже:

<?= $form->field($model, 'path')->textarea(['rows' => 6]) ?>

Я хочу временно преобразовать эти пути в список dropDownSelect в представлении, а затем в контроллере я снова включу выбранные элементы в строку для проверки и сохранения.

В представлении _form.php у меня есть следующее:

<?= $form->field($model, 'path')->dropDownList($model->getPathSelectList($model->path), ['multiple' => 'multiple']) ?>

В контроллере:

public function actionCreate()
    {
        $model = new StaticHtml();
        // var_dump($model->path);
        // die();
        if (is_array($model->path)) $model->path = implode(',', $model->path);

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            $model->path = $model->getPathsList(Yii::$app->getRequest()->getQueryParam('path'));
            return $this->render('create', [
                'model' => $model,              
            ]);
        }
    }

Обратите внимание на две закомментированные строки var_dump($model->path) и die(). Я устанавливаю их для отладки, потому что каждый раз, когда я выбираю из dropDownList и отправляю форму, проверка завершается ошибкой и сообщает мне, что Path must be a string и, конечно же, нет никаких выбор зарезервирован в отличие от других полей, и var_dump($model->path) печатает NULL:

введите здесь описание изображения

В приведенном выше коде есть два метода модели:

  1. getPathsList() он вызывается из контроллера и преобразует начальный путь в метки пути и устанавливает их как строку csv.
  2. getPathSelectList в представлении, и он преобразует csv в ассоциативный массив, ключи и значения которого равны для каждого, чтобы быть списком данных для поля dropDownList.

До этого момента я думаю, что для обновления потребуется больше, но, тем не менее, в чем проблема в моем коде, который не позволяет опубликовать $model->path, поэтому он печатает NULL с var_dump()?

Я почти уверен, что это проблема с получением данных из формы, потому что я пытался:

var_dump(Yii::$app->getRequest()->post('path'));
var_dump(Yii::$app->getRequest()->post('title')); 
var_dump(Yii::$app->request->post('path'));

и все они возвращают NULL


person SaidbakR    schedule 31.07.2016    source источник


Ответы (1)


если ваше правило проверки вы можете добавить

skipOnEmpty => true

В противном случае вы можете переопределить проверку таким образом

['path', 'required', 'isEmpty' => function ($value) {
    return empty($value);
}]
person scaisEdge    schedule 31.07.2016
comment
Большое спасибо, но я использовал обратный вызов beforeValidation в модели для выполнения преобразования значения. Дело до сих пор не ясно, почему я не смог получить значения, отправленные из формы в контроллере?! - person SaidbakR; 31.07.2016
comment
1) - Пробовали ли вы предложенное предложение.. что произошло.. у вас есть ошибка.. или не выполняется... 2) если вы выполняете перед проверкой.. это может произойти на уровне модели перед отправкой на контроллер.. (beforeValidation должен быть выполнен.. до выполнения вызова функции проверки)... в любом случае хорошим местом для вашего преобразования является метод afterFind() в модели и контроллер перед безопасным, поэтому не мешайте проверке.. - person scaisEdge; 31.07.2016
comment
Вы имеете в виду сбой получения данных из формы в контроллере из-за того, что данные сначала отправляются в модель, поэтому проверка не выполняется, а затем данные не передаются контроллеру? - person SaidbakR; 31.07.2016
comment
Нет... я не знаю вашего кода и не могу подтвердить это без глубокого анализа... Но во-первых, что случилось с проверкой на пустое значение... (думаю, основная проблема в этом...) - person scaisEdge; 31.07.2016