2016-07-31 24 views
0

有一個叫path數據庫字段是文本類型,它是用來存儲路徑標識字符串作爲CSV,類似如下:Yii2 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中選擇並提交th E型,驗證失敗,並告訴我,Path must be a string,當然也沒有與其他領域保留的任何選擇和var_dump($model->path)打印NULL

enter image description here

在上面的代碼,在兩個模型的方法:

  1. getPathsList()它從控制器調用,它將初始路徑轉換爲路徑標記並將它們設置爲csv字符串。
  2. getPathSelectList在視圖中,它將csv轉換爲關聯數組,其鍵和值相等,每個關聯數組都是dropDownList字段的數據列表。

直到這一點上,我認爲這將需要更多的更新,但然而,是什麼在我的代碼,阻止張貼$model->path所以它打印NULLvar_dump()問題?

我敢肯定,這是從形式接收數據,因爲我想一個問題:

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

,他們都將返回NULL

回答

0

如果您的驗證規則,你可以添加

skipOnEmpty => true

否則,您可以覆蓋檢查這樣

['path', 'required', 'isEmpty' => function ($value) { 
    return empty($value); 
}] 
+0

非常感謝,但我使用模型中的'beforeValidation'回調來執行值的轉換。這點仍然不清楚,這就是爲什麼我無法接收到從控制器表單提交的值?! – SaidbakR

+1

1) - 你有沒有嘗試過提供的建議..發生了什麼事情..你有錯誤..或沒有執行......2)如果你執行beforeValidation ..這可能發生在模型級別之前發送到控制器..(beforeValidation應執行..在執行驗證函數調用之前)...無論如何,一個好的地方爲您的轉換是模型中的afterFind()方法和安全前的控制器,因此不會干擾驗證。 – scaisEdge

+0

您是否意味着由於首先將數據提交給模型而從控制器中的表單接收數據失敗,因此驗證失敗,然後它不會將數據傳遞給控制器​​? – SaidbakR