CHtml::activeFileField的问题

因为我要用JS赋值给fileFiled,但是fileFiled本身是不能赋值的,但我发现在fileFiled之前有一个hiddenFiled


public static function activeFileField($model,$attribute,$htmlOptions=array())

	{

		self::resolveNameID($model,$attribute,$htmlOptions);

		// add a hidden field so that if a model only has a file field, we can

		// still use isset($_POST[$modelClass]) to detect if the input is submitted

		$hiddenOptions=isset($htmlOptions['id']) ? array('id'=>self::ID_PREFIX.$htmlOptions['id']) : array('id'=>false);

		return self::hiddenField($htmlOptions['name'],'',$hiddenOptions)

			. self::activeInputField('file',$model,$attribute,$htmlOptions);

	}

因为hiddneField和FildFiled的name是相同的,所以在控制器都可以接受,如果hiddenField能记录已经存在的值该多好啊,这样我在修改记录的时候,就很方便了,如果filefield有值的话,就用新值代替,没有的话,就用hiddenFiled的值,但是我看了源码,感觉似乎这个hiddenField是个摆设,根本没起到作用!


return self::hiddenField($htmlOptions['name'],'',$hiddenOptions)

如果把这一行改成:


return self::hiddenField($htmlOptions['name'],$model->$attribute,$hiddenOptions)

这样就可以让hiddenFiled起到作用了,不知道大家怎么理解这个问题?

没人想过这个问题吗?感觉很怪啊!

目前,先自己写了个CMyHtml继承了CHtml,然后重写了activeFileField这个方法,可能强这样做有他的用意吧!

用自己的类感觉方便多了!

因为file类型的表单项目不在$_POST中,当整个表单仅有一个file项的时候,$_POST[$classModel]是不存在的,所以加一个hidden项使isset($_POST)生效。 注释里写的。所以这个hidden还真就是个站位的作用。

file本身也不能通过在html标签赋值,所以服务器端返回它的值也没多大意义,当然如果想展示它的话,肯定需要使用的其他方式,比如一个链接/一个图片之类的,如果是保存以前的值,直接判断空就行,还比较安全,这是我的想法。。。

嗯,我以前都是在beforeSave里判断是否提交了图片文件,来判断是否update图片这个字段,似乎我那样做不是太安全!不过这次我是用JS给图片字段赋值的,而fileField是不能接受赋值的,只能上传本地文件以后才可以得到值,所以我就用到hiddenField了

谢谢你的解答,我再权衡一下!

想像不出这是个什么样的应用,不过大概的话,也许ajax上传图片没有这个问题

客气呀,互相帮助 :D