file-upload - Yii 表单生成器

标签 file-upload yii formbuilder

我一直在开发基于 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) 中可以按预期工作。这是新版本中的已知错误吗?如果是 - 有解决办法吗?或者我必须回滚到以前的版本吗?

提前致谢。

更新:

If you add a second validator (one for file and one for required) does it work?

不,事实并非如此。我相信我找到了原因。见下文。

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/

相关文章:

process - Yii框架实际开发流程

php - 如何在 2 个不同的表中提交表单值 symfony

php - 在表单类型中使用 Symfony2 UserPassword 验证器

sorting - Symfony表单实体/文档对属性进行排序

.net - 通过 Web 服务上传文件

php - 在 php 中上传时附加日期和时间以及文件名

yii 框架 View 中的 javascript 验证电子邮件

java - 通过 HTTP PUT 请求上传文件

api - 当我们有基于二进制的表单数据时,Jmeter 中用于 POST 方法的文件上传

php - Yii 数据库分析