SOLUZIONE: How to Save Uploaded File's Name on DatabaseJoomla 3.0 MVC upload di file in un componente di backend personalizzato
questo ha finito per avermi aiutato.
sto provando ad aggiungere un caricamento di file a un componente personalizzato utilizzando XML e database.
So come ottenere il caricamento del file eseguito in un ambiente PHP statico, ma le mie conoscenze sulla struttura MVC PHP in joomla lo rendono così non riesco ad aggiungerlo.
Quello che ho fatto finora:
• Aggiunto il campo nel file XML (del file di tipo)
• Aggiunto i campi del modulo di progetto vista amministrazione
• Aggiunta di una tabella My_project campo aggiuntivo (stesso come il caricamento delle immagini colonna)
Fino a questo punto funziona. (i campi sono mostrati nella componente di amministrazione backend)
Ora, quando si salva il documento con un file caricato in admin posteriore fine non salvarlo al database.
se metto il media come tipo di campo allora funziona, ma quando lo cambio in un file si rompe.
file 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 script di upload file normalmente uso
<?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";
}
?>
ma quale parte va nel modello e quale parte va nella controllore? e come chiamarlo.
intera vista è chiamato nel controller
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);
}
}
}
ho controllato il file multimediale com e si avvicinò con il codice del controller visto sopra (post principale editato). tuttavia ora mi dà un avvertimento JFolder :: create: ciclo infinito rilevato Avvertenza: spostamento del file non riuscito! --- e il mio tmp/log e la configurazione globale sono scrivibili. e cambiare la variabile $ dest non sembra funzionare o – user2617187
Penso che tu abbia bisogno di fare 2 cose. Per prima cosa, torna a php learning perché non hai nemmeno dichiarato '$ filepath'. Quindi si passa la variabile di stringa nella funzione 'upload' e si tenta di utilizzarla come array. Il secondo problema è che non dovresti eseguire attività in costruzione. Ti ho consigliato di sovrascrivere la funzione di salvataggio, quindi prima che i dati vengano archiviati nel database, il file verrà spostato.Penso che tu abbia bisogno di imparare molto di più sulla programmazione orientata agli oggetti in PHP. Si consiglia vivamente di provare a modificare il sistema o creare estensioni per Joomla, altrimenti rimarrete bloccati su quasi tutti i codici, anche se semplici. –
la ragione per cui l'ho messo il costrutto è perché non sono in grado di chiamare i metodi nel modello. normalmente in C# posso semplicemente fare CLass varible = new Class(); e quindi puoi fare varible.calltoMethod(), ma Class :: calltoMethod in php non sembra funzionare. e so che in joomla viene chiamato quel controller specifico, quindi ho creato un collegamento per testare le cose. – user2617187