除非明确标记为“安全”,否则Yii文件CFormInputElement将不会显示

时间:2013-08-05 20:35:16

标签: file-upload yii yii-cformmodel

我正在尝试使用表单生成器来构建简单的文件上传提示。我想指定文件的规则类似于

array('formFile', 'file', 'allowEmpty' => false, 'types' => 'html'),

但是出了点问题。仅当我明确将元素标记为'safe'(并删除'file'规则)时,才会显示文件上载元素。我错过了什么?

模型/ UploadForm.php

class UploadForm extends CFormModel
{
    public $year;
    public $formFile;

    public function rules ()
    {
        return array(
            array('year',    'required'),
            array('year',    'date', 'format'=>'yyyy'),
//            array('formFile', 'safe'),
            array('formFile', 'file', 'allowEmpty' => false, 'types' => 'html'),
        );
    }

    static public function getYearOptions () {...}
}

视图/外联网/ uploadForm.php

return array(
    'title' => 'Select year',
    'method' => 'post',
    'enctype' => 'multipart/form-data',

    'elements' => array(
        'year' => array(
            'type'  => 'dropdownlist',
            'items' => UploadForm::getYearOptions(),
        ),
        'formFile' => array(
            'type'  => 'file',
            'label' => 'form source file',
        ),
    ),

    'buttons' => array(
        'upload' => array(
            'type'  => 'submit',
            'label' => 'upload',
        ),
    ),
);

控制器/ ExtranetController.php

class ExtranetController extends CController
{
    public function actionIndex ()
    {
        $form = new CForm('application.views.extranet.uploadForm', new UploadForm());
        if ($form->submitted('upload') && $form->validate()) {...}
        $this->render('index', array('form' => $form));
    }
}

1 个答案:

答案 0 :(得分:1)

原因很简单。

表单构建器仅呈现被认为安全的输入元素(I.E.具有验证规则)。你所做的一切都很好,除了CFileValidator默认不是“安全”,而其他验证器是安全的。

解决此问题的最快方法如下:

// In your model::rules() function
return array(
    array('formFile', 'file', 'allowEmpty' => false, 'types' => 'html', 'safe' => true),
);

有关详情,请参阅以下两个链接:the CFileValidator#safe documentationthe Github issue for a problem very similar to yours