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