【问题标题】:Joomla 3.0 MVC file upload in custom component backend自定义组件后端中的 Joomla 3.0 MVC 文件上传
【发布时间】:2013-07-25 06:20:26
【问题描述】:

解决方案:How to Save Uploaded File's Name on Database

这最终帮助了我。

我正在尝试使用 XML 和数据库将文件上传添加到自定义组件。

我知道如何在静态 PHP 环境中完成文件上传,但我知道 关于 joomla 中的 PHP MVC 结构,所以我无法添加它。

到目前为止我做了什么:

• 在 XML 文件(类型文件)中添加了字段
• 在管理视图项目中添加了表单字段
• 添加一个额外的字段 My_project 表(与图片上传列相同)

直到此时它才起作用。(字段显示在管理后端组件中)

现在,当您在管理后端上传文件并保存文档时,它不会将其保存到数据库中。

如果我将媒体作为字段类型,那么它可以工作,但是当我将它更改为文件时,它会崩溃。

XML 文件

<?xml version="1.0" encoding="utf-8"?>
<form>
    <fieldset>

  <field name="project_file" type="file"

            label="Upload file"
            description="Upload file"  
            directory="mysites" /> 


       <field name="main_image" type="media"

            label="COM_MYSITES_FORM_LBL_PROJECT_MAIN_IMAGE"
            description="COM_MYSITES_FORM_DESC_PROJECT_MAIN_IMAGE" 
            filter="raw"
            directory="mysites" /> 

 </fieldset>

我通常使用的PHP文件上传脚本

<?php
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);

if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br>";
    echo "Type: " . $_FILES["file"]["type"] . "<br>";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";

    if (file_exists("upload/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }
?>

但是模型中有哪些部分,控制器中有哪些部分? 以及如何调用它。

在控制器中调用整个视图

class MysitesControllerProject extends JControllerForm {

    function __construct() {
        $this->view_list = 'projects';
        $jinput = JFactory::getApplication()->input;
        $files = $jinput->files->get('jform');
        $file = $files['project_file']; 
        $this->upload($file);
        parent::__construct();
    }

    public function upload($files)
    {
        $file_name = $files['name'];
        $src = $files['tmp_name'];
        $size = $files['size'];
        $upload_error = $files['error'];
        $type = $files['type'];
        $dest = "/home/vol3/byethost33.com/b33_13467508/bim-portfolio.cu.cc/htdocs/tmp";

        if (isset( $file_name)) {
            // Move the uploaded file.
            JFile::upload( $src, $filepath );
        }
    }

}

【问题讨论】:

    标签: php model-view-controller file-upload joomla3.0


    【解决方案1】:

    在数据库和 XML 表单中放置新字段只是工作的一半。您还必须编写文件保存/上传功能。有两个地方可以做。在控制器(例如保存任务过程)或模型中(有 2-3 个可以执行的功能)。查看此文件/administrator/components/com_media/controllers/upload.php(上传程序)。我只想扩展您的 save 功能,以便在将数据保存到数据库之前将文件存储在文件系统中。你可以在/libraries/legacy/controller/legacy.php找到原始的保存函数声明(对于Joomla 3.0.1,对于其他版本应该不难找到)

    这里是示例保存功能:

    public function save($key = null, $urlVar = null){
        // youre file upload code
    
        return parent::save($key = null, $urlVar = null)
    }
    

    【讨论】:

    • 我检查了 com 媒体文件并想出了上面看到的控制器代码(编辑的主帖)。但是现在它给了我一个警告 JFolder::create: Infinite loop detected 警告:无法移动文件! --- 我的 tmp/log 和全局配置是可写的。并且更改 $dest 变量似乎也不起作用
    • 我认为你需要做两件事。首先,回到 php 学习,因为你没有t even declared $filepath. Then you pass string variable into upload` 函数,你尝试将它用作数组。第二个问题是你不应该在构造中运行任务。我建议您覆盖保存功能,以便在将数据存储在数据库中之前,您将移动文件。我认为您需要更多地了解 PHP 中的面向对象编程。强烈建议您在尝试修改系统或为 Joomla 创建扩展之前,否则您几乎会卡在每一个甚至是简单的代码上。
    • 我把它放在构造中的原因是因为我无法调用模型中的方法。在 c# 中,我通常可以做 CLass varible = new Class();然后你可以做 varible.calltoMethod(),但是 php 中的 Class::calltoMethod 似乎不起作用。而且我知道在 joomla 中调用了特定的控制器,所以我在那里建立了一个链接以进行测试。
    • 这就是为什么我告诉你要更多地了解 PHP 中的面向对象编程。如果您现在已经使用 C++,则最多需要 3-4 天才能掌握它。我把上面的示例保存功能并标记了您应该添加文件上传代码的位置。
    • ty 为您提供帮助:在参考中,我发现了另一篇关于保存主题的额外帮助的帖子:stackoverflow.com/questions/16280955/…
    猜你喜欢
    • 1970-01-01
    • 2015-08-22
    • 2013-03-17
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    相关资源
    最近更新 更多