2013-07-25 14 views
5

ROZWIĄZANIE: How to Save Uploaded File's Name on DatabaseJoomla 3.0 MVC upload plików w niestandardowym komponentem

ten zakończył się mi pomóc.

Próbuję dodać plik do przesłania do komponentu użytkownika przy użyciu XML i bazy danych.

Wiem, jak załadować pliki w statycznym środowisku PHP, ale moja wiedza o strukturze MVC w joomla sprawia, że ​​nie mogę jej dodać.

co zrobiłem do tej pory:

• Dodano pole w pliku XML (z pliku typu)
• Dodano pola formularza w admin Zobacz projekt
• Dodano tabeli My_project dodatkowe pole (sama jak przesyłanie obrazu kolumny)

do tego momentu to działa. (pola są wyświetlane w składniku administrator backend)

teraz po zapisaniu dokumentu z pliku przesłanego w admin back-end nie zapisać do bazy danych.

Jeśli ustawię media jako typ pola, to działa, ale kiedy zmienię go na plik, zepsuje się.

plik 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 upload pliku skryptu i normalnie używać

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

ale jaka część idzie w modelu i jaka część idzie w kontrolerze? i jak do niego zadzwonić.

cały widok nazywany jest w kontrolerze

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

} 

Odpowiedz

6

Umieszczenie nowego pola w bazie danych i formy XML jest tylko połowa pracy. Musisz również napisać funkcję zapisywania/wysyłania plików. Są dwa miejsca, w których możesz to zrobić. W kontrolerze (na przykład zapisanie procedury zadania) lub modelu (istnieją 2-3 funkcje, w których można to zrobić). Zajrzyj do tego pliku /administrator/components/com_media/controllers/upload.php (procedura ładowania). Chciałbym tylko rozszerzyć twoją funkcję zapisz, więc zanim dane zostaną zapisane do pliku bazy danych będą przechowywane w systemie plików. Można znaleźć oryginalny zapisać deklarację funkcji w /libraries/legacy/controller/legacy.php (dla Joomla 3.0.1, dla pozostałych wersji nie powinno być trudne do znalezienia)

Oto próbka Zapisz funkcji:

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

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

Sprawdziłem plik multimedialny com i wymyślił kod kontrolera widziany powyżej (eddited main post). jednak teraz daje mi Ostrzeżenie JFolder :: create: Infinite loop detected Ostrzeżenie: Nie udało się przenieść pliku! --- i moja tmp/log i konfiguracja globalna są zapisywalne. i zmiana zmiennej $ dest nie wydaje się działać albo – user2617187

+0

Myślę, że musisz zrobić 2 rzeczy. Najpierw wróć do nauki php, ponieważ nie zadeklarowałeś nawet '$ filepath'. Następnie przekazujesz zmienną łańcuchową do funkcji 'upload' i próbujesz użyć jej jako tablicy. Drugi problem polega na tym, że nie powinieneś uruchamiać zadań w konstrukcji. Radziłem, abyś zastąpił funkcję zapisu, więc zanim dane zostaną zapisane w bazie danych, przeniesiesz plik.Myślę, że musisz dowiedzieć się znacznie więcej o programowaniu obiektowym w PHP. Zdecydowanie zaleca się, zanim spróbujesz zmodyfikować system lub utworzyć rozszerzenia dla Joomli, inaczej utkniesz w prawie każdym, nawet prostym kodzie. –

+0

Powód dla którego skonstruowałem to dlatego, że nie jestem w stanie wywołać metod w modelu. normalnie w języku C# mogę po prostu zrobić CLASS varible = new Class(); a następnie możesz zrobić varible.calltoMethod(), ale Class :: calltoMethod w php nie działa. i wiem, że w joomla ten konkretny kontroler jest wywoływany, więc zrobiłem tam łącze, aby przetestować rzeczy. – user2617187

Powiązane problemy