2013-07-25 36 views
5

SOLUTION:How to Save Uploaded File's Name on Database在自定義組件後端的Joomla 3.0 MVC文件上傳

這個結束了我的幫助。

我想添加文件上傳到使用XML和數據庫的自定義組件。

我知道如何在靜態PHP環境中完成文件上傳,但我的知識 關於joomla中的PHP MVC結構使得它無法添加它。

我迄今所做的:

•XML文件中添加的字段(文件類型)
•增加了在管理視圖項目表單字段
•增加了一個額外的字段MY_PROJECT表(一樣的圖片上傳列)

直到此時它的作品。(字段在管理後端組件所示)

現在,當您保存文檔與admin後面上傳的文件結束它不保存到數據庫。

如果我把媒體作爲字段類型,那麼它的工作原理,但是當我將其更改爲文件時,它打破了。

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文件上傳腳本我normaly使用

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

} 

回答

6

在數據庫中放置新的領域和XML格式僅僅是工作的一半。您還必須編寫文件保存/上傳功能。有兩個地方你可以做到。在控制器(例如保存任務程序)或模型(有2-3個功能,你可以做到這一點)。看看這個文件/administrator/components/com_media/controllers/upload.php(上傳程序)。我只會擴展你的保存函數,所以在數據將被保存到數據庫文件之前,將被保存在文件系統中。你可以找到原來保存在/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) 
} 
+0

我檢查了COM媒體文件並提出了上面看到的控制器代碼(eddited main post)。但現在它給了我一個警告JFolder :: create:檢測到無限循環警告:無法移動文件! ---和我的tmp /日誌和全局配置是可寫的。並更改$ dest varible似乎不工作要麼 – user2617187

+0

我認爲你需要做2件事。首先,回到php學習,因爲你甚至沒有聲明'$ filepath'。然後你將字符串變量傳遞給'upload'函數,並嘗試將它用作數組。第二個問題是你不應該在構造中運行任務。我建議您在數據存儲到數據庫之前重寫保存功能,以便移動文件。我認爲你需要在PHP中學習更多關於面向對象的編程。在嘗試修改系統或爲Joomla創建擴展程序之前強烈建議,否則幾乎每一個簡單的代碼都會陷入困境。 –

+0

我把它放在構造中的原因是因爲我無法調用模型中的方法。正常在C#我可以做CLass varible = new Class();然後你可以做varible.calltoMethod(),但在PHP中的Class :: calltoMethod似乎不起作用。並且我知道在joomla中,特定的控制器被調用,所以我在那裏做了一個鏈接以便測試事情。 – user2617187