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