CHtml::activeFileField

利用 CHtml::activeFileField 生成表单时会生成如下语句:




<input id="ytProduct_pic_saved_path" type="hidden" value="" name="Product[pic_saved_path]" /><input class="larges" name="Product[pic_saved_path]" id="Product_pic_saved_path" type="file" />



其中 hidden 应该是为更新操作服务的。

在添加的时候,这个值为空,如果我进行的是更新的动作,且添加的时候已经赋予这个字段值的话,应该在 value 中会有对应的值存在。可是我利用如下语句构造的时候,发现 value 值依旧是空值。




<?php echo CHtml::activeFileField($model, 'pic_saved_path', array('class' => 'larges')); ?>



是我书写有误还是?

将 CHtml 的 1162 行代码修改为:




return self::hiddenField($htmlOptions['name'],$model[$attribute],array('id'=>self::ID_PREFIX.$htmlOptions['id']))

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



搞定。只是不知道我是否误会了 qiang 这行代码的本意。冏

看注解,qiang做这个hidden field的主要意图是做判断 $_POST 时候所使用的,

至于值,好像没有什么左右吧?

要显示值的话,我想,可以另外做个区域说明~

Jerry 是不是误会了我的意思?

CHtml::activeXXX 很强大。不过貌似这个 CHtml::activeFileField 处理得不是很好。说一下我的需求吧。

比如我上传一个文件,保存的时候为 a.jpg 这个文件名。保存之后我再点击编辑进行修改,比如这个表有 filename, file_saved_path,渲染这个表单的时候filename有值,但是 file_saved_path 是没有值的。这样的话,如果我的上传代码是在 model 中完成的话,就会在更新的时候清空 file_saved_path 字段的值。当然,如果我是在 controller 中做更新处理动作的话这个问题也不存在了。

本来上传文件这个处理应该在controller中处理比较好,放到model中处理就不太合适了

Why?

几乎没有啥区别的两段代码要在 create 和 update 分别搞一下。有点麻烦哦。

这个hidden field的唯一用途是在当表单只包含file upload时,我们还能根据isset($_POST[ModelClass])来判断模型是否提交了。

你在更新模型时是需要对文件上传作验证的吧?这样可以避免这个hidden field直接覆盖你现有的文件名。

利用 $_POST 和 $_FILES 的特性,来做到这个hidden,确实高招~ :lol:

假设我现在是如果没有提供上传文件的话则不更新对应的字段。请问如何处理不更新这个字段呢?谢谢。

楼主这个问题解决了没有啊,怎么解决啊?