0

有一个称为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

4

1 回答 1

0

如果您的验证规则可以添加

skipOnEmpty => true

否则,您可以通过这种方式覆盖检查

['path', 'required', 'isEmpty' => function ($value) {
    return empty($value);
}]
于 2016-07-31T07:17:29.013 回答