我正在开发一个内容插件,它为com_content组件添加了一些额外的字段,其中一个字段的类型为" file"以下声明:
<field
name="zp_zipupl"
type="file"
onchange="jQuery(this).closest('form').attr('enctype','multipart/form-data')"
label="PLG_CONTENT_CUSTOMFIELDZ_ZP_ZIPUPL"
/>
...我正在onContentPrepare内容事件上处理上传过程,如下所示:
function onContentPrepare($context,&$article,&$params,$page){
$input = new JInputFiles();
$files = $input->get('jform');
if($files) foreach ($files as $inputFile) {
foreach ($inputFile as $file) {
$tmp_dir = $file['tmp_name'];
$dest_dir = JPATH_SITE.'/uploads/projects/';
$file_name_ext = $file['name'];
JFile::upload($tmp_dir,$dest_dir . $file_name_ext);
}
}
}
问题:
保存文章后,我收到错误&#34;警告:无法移动文件&#34;,但如果我输入&#34; uploads / project /&#34;目录文件在那里,所以它工作,但字段值不存储在数据库中。
如果我删除&#34; onchange&#34;对于此字段的事件,该值存储在数据库中,但由于未指定表单enctype,因此文件未上载(即使我手动编辑com_content文章/ tmpl / edit视图并设置我有的enctype上传时同样的问题。)
我已经改编了J的插件代码! 2.5 +相同的onContentPrepare代码=&gt;相同的行为,但文件没有上传。
*另外,不太重要的是onContentPrepareForm,如果我想用$ form-&gt; getValue(&#39; field_name&#39;)获取某个字段的值;它不起作用......
是什么导致这种情况?
谢谢!
答案 0 :(得分:1)
<强> [解决] 强>
主要是,我必须使用 onContentBeforeSave 事件来消除该警告,并且必须手动插入数据库中的值。它适用于J! 3.3和2.5.x.
待办事项:为类型为&#39; file&#39;的字段保留存储的数据库值。保存文章而不上传新文件。
代码:
function onContentBeforeSave($context,$article,$isNew){
//get jform
$jinput = JFactory::getApplication()->input;
$jform = $jinput->get('jform', null, null);
//get $_FILES
$input = new JInputFiles();
$files = $input->get('jform');
$uploadDir = $this->params->get('cfz_upload_path');
if( ! empty($files)) foreach ($files as $file) {
foreach ($file as $fieldName => $fileVals) {
$tmp_dir = $fileVals['tmp_name'];
$dest_dir = JPATH_SITE . $uploadDir;
$file_name_ext = $fileVals['name'];
if(JFile::upload($tmp_dir,$dest_dir . $file_name_ext)){
//append input value to jform
$jform['attribs'][$fieldName] = $uploadDir . $file_name_ext;
}
}
}
else{
//preserve file field value...
}
//add all attribs to $article
$article->attribs = json_encode($jform['attribs']);
}