我一直在研究Yii的应用程序。我面临着奇怪的事情..。
我要做的是将输入(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()和CModel::getSafeAttributeNames()。
CForm::getSafeAttributeNames()获得所有的模型验证器,并且只保留安全的。正如我们所看到的,CFileValidator不安全。
因此,不管有多少安全验证器(required或其他任何其他)分配了属性。如果至少有一个不安全( CForm::getSafeAttributeNames() ),则CForm::getSafeAttributeNames()从白名单中删除它。自1.1.12版本以来,文件验证程序是不安全的。这就是为什么在1.1.9中它对我非常有效的原因:)
因此,问题在于CFileValidator(或至少与其连接),而不是CForm。
到目前为止,我能看到的唯一解决方案是创建自己的验证器,由CFileValidator扩展,标记为安全,并使用它而不是内置的。但我甚至无法想象它会导致什么问题(我相信你的开发商有一个很好的理由使它不安全)。
我希望这会对某些人有所帮助。
更新2
array('image', 'file', 'safe'=>true, 'types'=>'png', 'on'=>'my-scenario')
此验证规则(显式safe=true)也有效。
发布于 2013-02-12 09:51:39
已在github上发布
发布于 2013-02-06 20:12:57
如果您添加了第二个验证器(一个用于文件,另一个用于必需),它是否有效?我最近也碰上了这个。
它似乎是由这个CForm中的行引起的
if($element->getVisible())
{
...
}getVisible检查当前模型场景中的活动验证器,并忽略当前验证器规则中未使用的任何输入。最后,我在我们的系统自定义CForm模型中注释了一些东西,但是如果您找到了更适合您的东西,请告诉我。
https://stackoverflow.com/questions/14731910
复制相似问题