有一个名为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
:
在上面的代码中,有两种模型的方法:
getPathsList()
从控制器调用它,它将初始路径转换为路径标记,并将它们设置为csv string。getPathSelectList
,它将csv转换为关联数组,其键和值等于每一个都是dropDownList字段的数据列表。直到这一点,我认为更新需要更多,但是,我的代码中有什么问题阻止发布$model->path
,因此它会NULL
打var_dump()
?< / p>
我很确定从表单接收数据是一个问题,因为我试图:
var_dump(Yii::$app->getRequest()->post('path'));
var_dump(Yii::$app->getRequest()->post('title'));
var_dump(Yii::$app->request->post('path'));
并且所有这些都返回NULL
答案 0 :(得分:0)
如果您的验证规则可以添加
skipOnEmpty => true
否则你可以用这种方式覆盖支票
['path', 'required', 'isEmpty' => function ($value) {
return empty($value);
}]