0

我正在开发一个内容插件,该插件向 com_content 组件添加了一些额外的字段,其中一个字段的类型为“文件”,并具有以下声明:

  <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);
        }
    }
}

问题:
保存文章后,我收到错误“警告:无法移动文件”,但如果我进入“uploads/project/”目录,文件就在那里,所以它工作了,但字段值没有存储在数据库。

如果我删除此字段的“onchange”事件,该值将存储在数据库中,但由于未指定表单 enctype,因此不会上传文件(即使我手动编辑 com_content article/tmpl/edit 视图并设置enctype 我在上传时遇到了同样的问题)。

我已经为 J! 修改了插件代码!2.5 + 相同的 onContentPrepare 代码 => 相同的行为,但文件未上传。

  • 所有目录都具有正确的权限并存在。
  • Joomla!3.3 / Joomla!2.5.24 PHP 5.4(本地)/5.3(共享主机)
  • $tmp_dir 目录 - 在 localhost (Linux, XAMPP) 上 - 是“opt/lampp/temp/”
  • $tmp_dir 目录 - 在共享主机上 - 是“/tmp/”

*另外,如果我想使用 $form->getValue('field_name'); 获取某个字段的值,那么 onContentPrepareForm 也不太重要 它不起作用...

什么可能导致这种情况?

谢谢!

4

1 回答 1

1

[解决方案]
主要是我不得不使用onContentBeforeSave事件来消除该警告,并且必须手动插入数据库中的值。它适用于两个 J!3.3 和 2.5.x。
TO-DO:在不上传新文件的情况下保存文章时保留“文件”类型字段的存储数据库值。

编码:

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']);
}
于 2014-08-21T14:40:55.617 回答