Php 自定义组件后端中的Joomla 3.0 MVC文件上载

Php 自定义组件后端中的Joomla 3.0 MVC文件上载,php,model-view-controller,file-upload,joomla3.0,Php,Model View Controller,File Upload,Joomla3.0,解决方案: 这最终帮助了我 我正在尝试使用XML和数据库将文件上载添加到自定义组件 我知道如何在静态PHP环境中完成文件上传,但我的知识 关于joomla中的PHP MVC结构,我无法添加它 到目前为止我所做的: •在XML文件中添加了字段(类型文件) •在管理视图项目中添加表单字段 •添加了一个额外字段My_项目表(与图像上载列相同) 直到这一点,它的工作。(字段显示在管理后端组件中) 现在,当您在管理后端保存上载了文件的文档时,它不会将其保存到数据库中 如果我把媒体作为字段类型,它就会工作,

解决方案:

这最终帮助了我

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

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

到目前为止我所做的:

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

直到这一点,它的工作。(字段显示在管理后端组件中)

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

如果我把媒体作为字段类型,它就会工作,但当我将其更改为文件时,它就会崩溃

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
$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";
  }
?>

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

下面是示例保存功能:

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

    return parent::save($key = null, $urlVar = null)
}

我检查了com媒体文件,找到了上面看到的控制器代码(eddited main post)。然而,现在它给了我一个警告:JFolder::create:检测到无限循环警告:无法移动文件!——我的tmp/log和全局配置是可写的。更改$dest变量似乎也不起作用。我认为您需要做两件事。首先,回到php学习,因为您甚至没有声明$filepath
。然后将字符串变量传递到
upload`函数中,并尝试将其用作数组。第二个问题是您不应该在构造中运行任务。我建议您重写保存功能,以便在数据存储到数据库中之前,您将移动文件。我认为您需要更多地了解PHP中的面向对象编程。在您尝试修改系统或为Joomla创建扩展之前,强烈建议您这样做,否则您几乎会被每一个,甚至是简单的代码所困扰。我之所以将其作为构造,是因为我无法调用模型中的方法。正常情况下,在c#中,我只需执行CLass varible=new CLass();然后可以执行varible.calltoMethod(),但php中的Class::calltoMethod似乎不起作用。我知道在joomla中,特定的控制器被调用,所以我在那里建立了一个链接,以便进行测试。这就是为什么我告诉您要学习更多关于PHP中面向对象编程的知识。如果你现在已经C++了,它将花费3-4天的时间来掌握它。我在上面添加了示例保存功能,并标记了您应该在哪里添加文件上载代码.ty以获得帮助:在参考资料中,我找到了另一篇关于保存主题的额外帮助的帖子:
public function save($key = null, $urlVar = null){
    // youre file upload code

    return parent::save($key = null, $urlVar = null)
}