首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Yii型建筑工地

Yii型建筑工地
EN

Stack Overflow用户
提问于 2013-02-06 14:51:31
回答 2查看 1.9K关注 0票数 2

我一直在研究Yii的应用程序。我面临着奇怪的事情..。

我要做的是将输入(type=file)添加到表单中。表单是通过表单生成器(CForm类)创建的。但是输入不会出现。

我的密码。主计长/行动:

代码语言:javascript
运行
复制
$model=MyModel::model()->findByPk(700);
$model->scenario='my-scenario';
$form=new CForm('path.to.forms.my-form', $model);

$this->render('view', array('form'=>$form));

查看:

代码语言:javascript
运行
复制
echo $form

表单配置:

代码语言:javascript
运行
复制
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',
        ),
    ),
);

型号:

代码语言:javascript
运行
复制
//.....
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)也有效。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-12 09:51:39

票数 1
EN

Stack Overflow用户

发布于 2013-02-06 20:12:57

如果您添加了第二个验证器(一个用于文件,另一个用于必需),它是否有效?我最近也碰上了这个。

它似乎是由这个CForm中的行引起的

代码语言:javascript
运行
复制
if($element->getVisible())
{
    ...
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14731910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档