2013-07-25 39 views
5

GIẢI PHÁP: How to Save Uploaded File's Name on DatabaseTải lên tệp tin Joomla 3.0 MVC trong phần phụ trợ thành phần tùy chỉnh

điều này đã giúp tôi.

tôi đang cố thêm tệp tải lên thành phần tùy chỉnh bằng XML và cơ sở dữ liệu.

Tôi biết cách tải tệp lên trong môi trường PHP tĩnh nhưng kiến ​​thức của tôi về cấu trúc PHP MVC trong Joomla làm cho nó không thể thêm nó.

Những gì tôi đã làm cho đến nay:

• Thêm lĩnh vực này trong file XML (của file type)
• Added các trường mẫu trong dự án view quản trị
• Thêm một bảng My_project trường bổ sung (giống như cột upload hình ảnh)

Cho đến thời điểm này nó hoạt động. (trường được trình bày trong phần backend admin)

Bây giờ khi bạn lưu tài liệu với một tập tin được tải lên trong admin lại kết thúc nó không lưu nó vào cơ sở dữ liệu.

nếu tôi đặt phương tiện làm loại trường thì nó hoạt động, nhưng khi tôi thay đổi nó thành tệp, nó sẽ bị hỏng.

tập tin 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 tập tin tải lên kịch bản tôi normaly sử dụng

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

nhưng phần nào đi trong mô hình và phần nào đi vào bộ điều khiển? và cách gọi.

toàn bộ quan điểm được gọi là trong bộ điều khiển

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

} 

Trả lời

6

Đặt lĩnh vực mới trong cơ sở dữ liệu và hình thức XML chỉ là một nửa công việc. Bạn cũng phải viết chức năng lưu/tải lên tệp. Có hai nơi bạn có thể làm. Trong bộ điều khiển (ví dụ lưu thủ tục tác vụ) hoặc mô hình (có 2-3 chức năng mà bạn có thể thực hiện). Nhìn vào tập tin này /administrator/components/com_media/controllers/upload.php (thủ tục tải lên). Tôi sẽ chỉ mở rộng chức năng của bạn để lưu vì vậy trước khi dữ liệu sẽ được lưu vào tệp cơ sở dữ liệu sẽ được lưu trữ trên hệ thống tệp. Bạn có thể tìm gốc lưu khai báo hàm trong /libraries/legacy/controller/legacy.php (cho Joomla 3.0.1, cho các phiên bản khác, nó không nên khó tìm)

Đây là mẫu tiết kiệm chức năng:

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

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

tôi đã kiểm tra các tập tin phương tiện truyền thông com và đã đưa ra mã điều khiển được nhìn thấy ở trên (eddited main post). Tuy nhiên bây giờ nó mang lại cho tôi một cảnh báo JFolder :: tạo: Vòng lặp vô hạn phát hiện Cảnh báo: Không thể di chuyển tập tin! --- và tmp/log của tôi và cấu hình toàn cầu là viết. và thay đổi $ dest varible dường như không hoạt động hoặc – user2617187

+0

Tôi nghĩ bạn cần phải làm 2 việc. Đầu tiên, quay trở lại với việc học php, bạn thậm chí còn không khai báo '$ filepath'. Sau đó, bạn chuyển biến chuỗi thành hàm 'upload' và bạn cố gắng sử dụng nó như một mảng. Vấn đề thứ hai là bạn không nên chạy các nhiệm vụ trong cấu trúc. Tôi khuyên bạn nên ghi đè chức năng lưu để trước khi dữ liệu được lưu trữ trong cơ sở dữ liệu bạn sẽ di chuyển tập tin.Tôi nghĩ rằng bạn cần phải tìm hiểu thêm về lập trình hướng đối tượng trong PHP. Nó được khuyến khích mạnh mẽ trước khi bạn cố gắng sửa đổi hệ thống hoặc tạo phần mở rộng cho Joomla hoặc bạn sẽ gặp khó khăn ở hầu như mọi mã đơn giản. –

+0

lý do tôi đặt nó là do tôi không thể gọi các phương thức trong mô hình. normaly trong C# i chỉ có thể làm CLass varible = new Class(); và sau đó bạn có thể làm varible.calltoMethod(), nhưng Class :: calltoMethod trong php dường như không hoạt động. và tôi biết rằng trong Joomla rằng bộ điều khiển cụ thể được gọi là vì vậy tôi đã tạo một liên kết ở đó để kiểm tra mọi thứ. – user2617187