2

我一直在研究基于 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)也有效。

4

2 回答 2

1

如果您添加第二个验证器(一个用于文件,一个用于必需),它是否有效?我自己最近遇到了这个问题。

这似乎是由CForm 中的这一行引起的:

if($element->getVisible())
{
    ...
}

getVisible 检查当前模型场景的活动验证器,并忽略当前验证器规则中未使用的任何输入。我最终在我们的系统的自定义 CForm 模型中注释掉了一些东西,但是如果你找到更适合你的东西,请告诉我。

于 2013-02-06T20:12:57.730 回答
1

问题已在 github 上发布

https://github.com/yiisoft/yii/issues/2089

于 2013-02-12T09:51:39.450 回答