Back to top

Autore Topic: Comp. J2.5 - Form field di tipo "file" non salva il contenuto [RISOLTO]  (Letto 3799 volte)

Offline giovi

  • Instancabile
  • ******
  • Post: 9835
  • Sesso: Maschio
    • Mostra profilo
Seguo ancora la classica guida di sviluppo componente mvc per Joomla! 2.5 "hello world!".
 
Il problema sorge nell'eseguire l'upload di un file ed il successivo salvataggio della sua posizione nella tabella del componente. Tutti gli altri parametri (radio buttons, input, testi, ecc...) vengono correttamente salvati. Il form field di tipo "file" non vuole saperne di salvare il contenuto tanto che se imposto il campo come "required" ho sempre l'errore di campo vuoto. Come caricare e registrare il file?
 
Ho inserito l'attribuito encript ecc... nel form ed ho seguito qualche indicazione frammentaria fornita da sviluppatori su stackoverflow e sul forum stesso ma non ne vengo a capo. Grosso modo prevedevano il recupero del nome e l'upload del file nel controller nel metodo save() o nel model nel metodo prepareTable()

Errori riscontrati: con attributo "required" = campo vuoto; senza attributo "required" = impossibile spostare il file
in entrambi i casi il campo è vuoto dopo l'aggiornamento della pagina.
« Ultima modifica: 20 Giu 2013, 16:17:40 da giovi »

mau_develop

  • Visitatore

Offline giovi

  • Instancabile
  • ******
  • Post: 9835
  • Sesso: Maschio
    • Mostra profilo
Re:Comp. J2.5 - Form field di tipo "file" non salva il contenuto
« Risposta #2 il: 20 Giu 2013, 09:20:58 »
Adattando il codice il file viene effettivamente caricato (evvai, grazie maurizio! :) ), ma al termine del caricamento - che avviene per mezzo del codice:
Codice: [Seleziona]
function save()
 {
  // Get the file data array from the request.
  $file = JRequest::getVar('jform', null, 'files', 'array');
  // Make the file name safe.
  jimport('joomla.filesystem.file');
  $file['name'] = JFile::makeSafe($file['name']);

  // Move the uploaded file into a permanent location.
  if ($file['name']['filename']!=""){
 
 // Make sure that the full file path is safe.
   $filepath = JPath::clean( '../images/'.strtolower( $file['name']['filename'] ) );
   // Move the uploaded file.
   JFile::upload( $file['tmp_name']['filename'], $filepath );
  }
  return parent::save();
 }
sebbene richiamo il metodo originale, il nome del file non viene salvato nel campo! Se infatti imposto il campo come required l'immagine viene caricata ma visualizzo l'errore "Campo obbligatorio: File"

mau_develop

  • Visitatore
Re:Comp. J2.5 - Form field di tipo "file" non salva il contenuto
« Risposta #3 il: 20 Giu 2013, 11:29:42 »
si vede che siamo fermi quì:
http://joomlacode.org/gf/project/joomla/tracker/?action=TrackerItemEdit&tracker_item_id=25193

quì ti spiega in altro modo il problema:
http://forum.joomla.org/viewtopic.php?p=2601677

puoi risolvere nel caricamento dei dati nel db dove fai il check ritornando false se non c'è nulla nel valore usando la messggistica lo fai tornare al form con l'errore.

Altrimenti fai un esercizio didattico e aggiungi un controllo js personalizzato, nelle guide di sviluppo dovrebbe esserci un esempio
« Ultima modifica: 20 Giu 2013, 11:32:50 da M_W_C »

Offline giovi

  • Instancabile
  • ******
  • Post: 9835
  • Sesso: Maschio
    • Mostra profilo
Re:Comp. J2.5 - Form field di tipo "file" non salva il contenuto
« Risposta #4 il: 20 Giu 2013, 14:08:34 »
Mi accorgo solo ora che il record nel database viene popolato interamente, anche il campo relativo al file è completo! Il problema si verifica dunque nel recupero di tale valore: nella view del backend (sia lista completa che nella modifica del singolo elemento) tutti i campi sono popolati tranne quello relativo al file.
 
Potrebbe non essere un problema in quanto come descrizione del campo si può indicare che va compilato solo per sostituire il file precedente ma va comunque stampato il nome del vecchio file, almeno per informare l'utente di che roba si tratta!
Mi avvio per questa strada.. speriamo bene  :(

Offline simone83

  • Appassionato
  • ***
  • Post: 362
  • Sesso: Maschio
    • Mostra profilo
Re:Comp. J2.5 - Form field di tipo "file" non salva il contenuto
« Risposta #5 il: 20 Giu 2013, 15:08:24 »
il campo file non viene popolato di sicuro, non ci puoi mica scrivere, quindi che succede se lo metti required? che lo devi reinserire sempre, ma se non lo reinserisci quando salvi lui che fa? te lo cancella.


questo è il codice del field tipo file


Codice: [Seleziona]
return '<input type="file" name="' . $this->name . '" id="' . $this->id . '" value=""' . $accept . $disabled . $class . $size
         . $onchange . $required . ' />';


come vedi value e sempre vuoto, quindi devi lavorare a livello del model nella funzione save dove dovrai capire se un file e stato caricato precedentemente ed aggiungerlo ai dati da salvare.


Se lo vuoi invece come obbligatorio devi intervenire a livello del model nella funzione getForm


if(!empty($form->getValue('file'))){


$form->setFieldAttribute('file','required',false);   

}


ti toglie il required se c'e un valore di gia


Citazione
pero ora che succede non ti salva piu i dati xche c'e un campo required quindi devi togliere il required nel controller nel metodo save prima di validare la form

edit qui, basta la modifica di prima tanto anche il controller fa getForm ed il procedimento è lo stesso

non è facile fare questa cosa se non conosci bene la struttura ne sono consapevole ma magari prova
« Ultima modifica: 20 Giu 2013, 15:22:25 da simone83 »
BRAINCODE
Da Psd a Joomla - Sviluppo componenti joomla - SEO con Joomla
x-brain

Offline giovi

  • Instancabile
  • ******
  • Post: 9835
  • Sesso: Maschio
    • Mostra profilo
Re:Comp. J2.5 - Form field di tipo "file" non salva il contenuto
« Risposta #6 il: 20 Giu 2013, 15:27:31 »
ciao simone, grazie anche a te per l'intervento. Sono riuscito a far salvare la path del file all'interno del campo file con il metodo setVar e richiamando poi la funzione parent::save(), ma il problema resta nella visualizzazione di tale valore nel backend, sia nella lista generica che nel form di modifica di ogni singolo elemento. Come è possibile recuperare il valore precedentemente salvato nel campo di tipo file? Devo fare necessariamente una richiesta al database o il valore è già conservato in qualche variabile dopo che il model ne ha fatto richiesta?

Offline simone83

  • Appassionato
  • ***
  • Post: 362
  • Sesso: Maschio
    • Mostra profilo
Re:Comp. J2.5 - Form field di tipo "file" non salva il contenuto
« Risposta #7 il: 20 Giu 2013, 15:35:19 »
te l'ho gia scritto, il campo file non ha valore dopo, ma nella form che stampi nella tua view se fai $this->item->file vedi il path.


Con il field di tipo file puoi fare poco, prova a crearti un customField

BRAINCODE
Da Psd a Joomla - Sviluppo componenti joomla - SEO con Joomla
x-brain

Offline giovi

  • Instancabile
  • ******
  • Post: 9835
  • Sesso: Maschio
    • Mostra profilo
Re:Comp. J2.5 - Form field di tipo "file" non salva il contenuto
« Risposta #8 il: 20 Giu 2013, 15:46:34 »
Uff.. Hai ragione, questo form field "file" non serve proprio a niente...  :-\

Offline simone83

  • Appassionato
  • ***
  • Post: 362
  • Sesso: Maschio
    • Mostra profilo
Re:Comp. J2.5 - Form field di tipo "file" non salva il contenuto
« Risposta #9 il: 20 Giu 2013, 16:01:11 »
il field di tipo file è stato concepito per fare caricamenti generali secondo me non per caricare qualcosa in una scheda. Per intendersi, per fare il caricamento nel gestore media
BRAINCODE
Da Psd a Joomla - Sviluppo componenti joomla - SEO con Joomla
x-brain

Offline giovi

  • Instancabile
  • ******
  • Post: 9835
  • Sesso: Maschio
    • Mostra profilo
Re:Comp. J2.5 - Form field di tipo "file" non salva il contenuto
« Risposta #10 il: 20 Giu 2013, 16:17:14 »
non parliamo del gestore media, che purtroppo è un altro specchio per le allodole... :( Risolverebbe tutti i problemi sulla gestione dei file se solo fosse più flessibile!
 
Alla fine comunque visualizzo la path. Ho "risolto" eliminando la possibilità di modificare gli elementi così da non perdere il riferimento al vecchio file.
 
Grazie Maurizio e grazie Simone per la vostra pazienza e per il vostro supporto!

 



Web Design Bolzano Kreatif