我一直在研究基于 Yii 的应用程序。而且我遇到了奇怪的事情...
我想要做的是将 input(type=file) 添加到表单中。表单是通过表单构建器(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) 中可以正常工作。这是新版本中的已知错误吗?如果是 - 有解决方案吗?还是我必须回滚到以前的版本?
提前致谢。
更新:
如果您添加第二个验证器(一个用于文件,一个用于必需),它是否有效?
不,它没有。我相信我找到了原因。见下文。
这似乎是由 CForm 中的这一行引起的。
是,对的。昨天,带着调试器,我更深入了:)
CFormElement::getVisible()
最终调用CModel::isAttributeSafe()
and CModel::getSafeAttributeNames()
。
CForm::getSafeAttributeNames()
获取所有模型验证器,只留下安全的。我们可以看到CFileValidator 是不安全的。
required
因此,分配属性的安全验证器(或任何其他)有多少并不重要。CForm::getSafeAttributeNames()
如果至少有一个 unsafe( file
),则将其从白名单中删除。自 1.1.12 版本以来,文件验证器不安全。这就是为什么它在 1.1.9 中完美地为我工作:)
因此问题出在 CFileValidator 中(或至少与它相连)而不是 CForm 中。
到目前为止我能看到的唯一一个解决方案是创建自己的验证器,它从标记为安全的 CFileValidator 扩展并使用它而不是内置的。但我什至无法想象它可能会导致什么问题(我相信 Yii 开发人员有充分的理由制作它不安全)。
我希望这对某人有所帮助。
更新 2
array('image', 'file', 'safe'=>true, 'types'=>'png', 'on'=>'my-scenario')
此验证规则(显式safe=true
)也有效。