我一直在开发基于 Yii 的应用程序。我遇到了奇怪的事情......
我想做的是将输入(类型=文件)添加到表单中。表单是通过表单生成器(CForm
类)创建的。但输入不会出现。
我的代码。 Controller /操作:
$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) 中可以按预期工作。这是新版本中的已知错误吗?如果是 - 有解决办法吗?或者我必须回滚到以前的版本吗?
提前致谢。
更新:
block 引用>If you add a second validator (one for file and one for required) does it work?
不,事实并非如此。我相信我找到了原因。见下文。
block 引用>It seems to be caused by this line in 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 扩展的验证器,并使用它而不是内置的。但我什至无法想象它可能会导致什么问题(我相信 Yii 开发人员有充分的理由)使其不安全)。
我希望这对某人有帮助。
更新2
array('image', 'file', 'safe'=>true, 'types'=>'png', 'on'=>'my-scenario')
此验证规则(显式
safe=true
)也有效。
最佳答案
如果添加第二个验证器(一个用于文件,一个用于必需),它可以工作吗?我自己最近也遇到过这个问题。
好像是这个line in CForm引起的:
if($element->getVisible())
{
...
}
getVisible 检查当前模型场景的事件验证器,并忽略当前验证器规则中未使用的任何输入。我最终在我们系统的自定义 CForm 模型中注释了一些内容,但如果您发现更适合您的东西,请告诉我。
关于file-upload - Yii 表单生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14731910/