2013-02-06 85 views
2

我一直在開發基於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

如果添加第二個驗證程序(一個用於文件,另一個用於必需)是否有效?我最近自己碰到了這個。

它似乎被這個line in CForm引起:

if($element->getVisible()) 
{ 
    ... 
} 

的getVisible檢查活動驗證此當前模型場景,並留下了未在當前的驗證規則中的任何輸入。我最終在我們的系統的定製CForm模型中評論了一些事情,但是如果讓我知道是否找到了一些對您更好的方法。

+0

謝謝您的回答。看到我更新的帖子。 –

+0

謝謝,這很有幫助。我可以聯繫samdark向他詢問,他在這裏做了修改:https://github.com/yiisoft/yii/commit/1d33c35ea0d9b2254dec7afebab3e2e1d5ce02ce#framework/validators/CFileValidator.php – acorncom

+0

僅供參考,這裏是關於這個變化的Github問題。它來到Yii 1.1.12:https://github.com/yiisoft/yii/pull/1083 – acorncom