我一直在開發基於Yii的應用程序。我曾經面對奇怪的事情...Yii窗體生成器
我想要做的是將輸入(類型=文件)添加到窗體中。表單通過表單構建器創建(CForm
類)。但輸入不會出現。
我的代碼。控制器/動作:
$model=MyModel::model()->findByPk(700);
$model->scenario='my-scenario';
$form=new CForm('path.to.forms.my-form', $model);
$this->render('view', array('form'=>$form));
查看:
echo $form
形式配置:
return array(
'attributes' => array(
'enctype' => 'multipart/form-data',
),
'elements' => array(
'name' => array(
'type' => 'text',
),
'image' => array(
'type' => 'file',
),
),
'buttons' => array(
'save' => array(
'type' => 'submit',
'label' => 'Save',
),
),
);
型號:
//.....
public $image;
// ....
public function rules()
{
return array(
//...
array('image', 'file', 'types'=>'png', 'on'=>'my-scenario'),
);
}
有了上面的代碼我期望看到兩個領域 - 文本和文件。但只有文字出現。
如果我將file
驗證程序更改爲,例如required
- 它可以工作,但我需要文件驗證程序。
我正在使用Yii版本1.1.13。
上面的代碼最有意思的工作與早期的Yii(1.1.9)一樣。這是新版本中的已知錯誤嗎?如果是 - 是否有解決方案?還是我必須回滾到以前的版本?
在此先感謝。
UPDATE:
如果添加第二個驗證器(一個用於文件,一個用於所需的)工作的呢?
不,它沒有。我相信我找到了原因。見下圖。
這似乎是此行的CForm引起..
是的,正確的。昨天,我帶着調試器進行了更深入的研究:)
CFormElement::getVisible()
最終調用CModel::isAttributeSafe()
和CModel::getSafeAttributeNames()
。
CForm::getSafeAttributeNames()
獲取所有模型驗證程序並僅保留安全程序。我們可以看到CFileValidator is not safe。
因此,分配多少安全驗證程序(required
或任何其他)都沒有關係。 CForm::getSafeAttributeNames()
將其從白名單中刪除,如果至少有一個不安全(file
)。 從1.1.12版本開始,文件驗證器是不安全的。這就是爲什麼它在1.1中對我完美工作的原因。9 :)
因此,問題出在CFileValidator(或至少與它連接),而不是CForm。
我目前唯一可以看到的解決方案是創建自己的驗證器,從CFileValidator擴展到標記爲safe並使用它來代替內置。但我甚至無法想象它可能會導致什麼問題(我相信Yii開發人員有一個好的使其不安全的原因)。
我希望這對別人有幫助。
更新2
array('image', 'file', 'safe'=>true, 'types'=>'png', 'on'=>'my-scenario')
這個驗證規則(明確safe=true
)也適用。
+ 1謝謝。這是確切的答案。 – shgnInc