我正在尝试使用表单生成器来构建简单的文件上传提示。我想指定文件的规则类似于
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));
}
}
答案 0 :(得分:1)
原因很简单。
表单构建器仅呈现被认为安全的输入元素(I.E.具有验证规则)。你所做的一切都很好,除了CFileValidator默认不是“安全”,而其他验证器是安全的。
解决此问题的最快方法如下:
// In your model::rules() function
return array(
array('formFile', 'file', 'allowEmpty' => false, 'types' => 'html', 'safe' => true),
);
有关详情,请参阅以下两个链接:the CFileValidator#safe documentation和the Github issue for a problem very similar to yours。