Joomla.it Forum
Componenti per Joomla! => Gestione Form => : rushseeker 19 Apr 2011, 12:18:33
-
Salve ( probabilmente ho già scritto qualcosa del genere... ma non riesco a trovare più il post )
Ho seguito la guida di "vales"
http://www.joomla.it/articoli-della-community/3796-chronofrms-e-chronoconnectivity-lunione-fa-la-forza.html
Il problema che ho notato quando si va in edit se non metto niente nel campo upload accade questo: il campo file viene messo a NOFILE (il file nel server rimane).
Ricordo il suggerimento di vales
prova a mettere su server side validation qualcosa:
Queste righe di codice fanno (finalmente) reagire in qualche modo chronoform:
Cosa ho provato a fare: visto che se mi azzardo a mettere un uploader di nome file_0 vuoto lo sovrascrive, lasciando il vecchio file sul server, ho cambiato il nome dell'uploader a file_1 e ho provato a mettere questo:
<?php if ((is_uploaded_file($_FILES['file_1']['tmp_name']))){
$_FILES['file_0']['tmp_name'] = $_FILES['file_1']['tmp_name'];
$_FILES['file_0']['size'] = $_FILES['file_1']['size'];
$_FILES['file_0']['type'] = $_FILES['file_1']['type'];
}
?>
mi arriva un messaggio di errore: non puoi fare l'upload di questo tipo di file.
I problemi da risolvere sono:
1)se non faccio upload non devo toccare il file immagine.
2) se faccio l'upload del nuovo file il vecchio va cancellato.
-
Questo ti può aiutare ?
http://forum.joomla.it/index.php/topic,133061.msg588127.html#new
-
Questa soluzione si riferisce a se non inserisci un file allora si blocca.
Nel mio caso mi trovo in fase di EDIT grazie a Chronoconnectivity. Se non inserisco nessun file, allora il vecchio file caricato precedentemente, viene sostituito da NOFILE (anche se in realtà il file originale rimane sul server).
Quello che vorrei tentare di fare é : se non inserisco niente allora devo proseguire con l'aggiornamento ma mantenendo il vecchio file.
Spero di essere stato chiaro.
-
Ho pensato di scrivere questa porzione di codice per provare a capire come chronoform gestisce i campi in edit.
Ho notato che controllando $Myrows->file_0 posso gestire in qualche modo dei messaggi di avviso in fase di EDIT.
<?php
echo "{file_0}";
echo " Myrow ".$Myrow->file_0;
if(($Myrows->file_0)=='')
{
echo 'Non sono stati inseriti file immagine o file zip';
}
else{
echo '<a href="'.Juri::base().'components/com_chronocontact/uploads/scheda_sopralluogo_ver2/'.$MyRow->file_0.'"/>'.$MyRow->file_0.'</a>';
}
?>
I risultati dopo una verifica non sono quelli sperati.
-
Credete sia possibile creare un pulsante che se viene cliccato elimina il file presente sul server?
-
Credo dovresti fare uno script da inserire nel campo Server side validation del form che usi per le modifiche ed li fare le verifiche, se il nome del file inserito è vuoto mantieni il vecchio file altrimenti va il nuovo.
Dovresti anche diversificare il nome del campo di inserimento del file in fase modifica dal nome del file in fase di inserimento altrimenti si potrebbero creare dei problemi.
Successivamente sempre in Server side validation, quando necessario rendi il nome del campo della tabella uguale al nome del file modificato.
-
Allora:
sto provando ad adottare la seguente soluzione...
Ho creato un nuovo campo di testo, al cui interno, in javascript, ho il percorso completo del file che inserisco in UPLOAD.
Nel form che si occupa dell'editing ho inserito quindi 2 campi PathFile_0 e PathFile_new: uno che contiene il percorso del vecchio file, l'altro che contiene il percorso del nuovo file se mai viene inserito. In allegato una immagine della zona interessata.
Quindi... in Validate ho inserito il seguente codice.
<?php
if ((is_uploaded_file($_FILES['file_0']['tmp_name']))){
unlink ($_POST['PathFile_0']);
$_POST['PathFile_0'] = $_POST['PathFile_new'];
?>
purtroppo non funziona come dovrebbe.
Cosa ne pensi vales?
-
Penso di aver trovato il problema: il fatto è che non riesco a dare lo stesso nome di file ai campi pathfile_0 e il nome effettivo che avrà il file alla fine dell'upload.
ho notato che su FILEUPLOAD
c'è questa stringa
$filename = date('YmdHis').'_'.$chronofile['name'];
Questa stringa mi dice che metterò una data prima del nome del file al file di upload.
Ora... come faccio a fare in modo che pathfile_0 e file_0 possano avere lo stesso valore?
-
Ho notato un'altro bug:
Se eseguo un delete in chronoconnectivity, i file di upload rimangono sul server! ( sempre peggio! )
-
Non è un bug, è un limite del componente.
Che comunque può essere gestito con opportuni script che possono rimuovere gli allegati in tali circostanze.
-
mi hanno proposto questa soluzione:
http://www.chronoengine.com/forums/viewtopic.php?f=12&t=21682&p=69353#p69353
Ma... perché non deve funzionare!?... non capisco!
-
Quando si inserisce un allegato abbiamo due entità da gestire il nome del file che viene eventualmente registrato in un campo della tabella associata al form ed il file stesso che assume per nome quello predisposto in Field name in File upload del form e che sarà uguale al nome del campo detto sopra.
L'esempio di quella guida citata era molto rudimentale e non affrontava il problema che tu hai posto.
Io come, detto sopra, sfrutterei le potenzialità del campo Server side Validation.
Preliminarmente nel form acquisirei in un campo nascosto il nome del file già presente.
Ora hai due possibilità
1) inserisci un nuovo file e quindi avrai un nuovo nome dell'allegato
2) non inserisci un nuovo file e quindi il campo nome allegato è vuoto.
In relazione a queste due possibilità in Server side validation puoi rigirare le cose come vuoi
1) se il file è nuovo il nome_allegato è diverso da vuoto e cancelli in vecchio file nella directory configurata.
2) se il file è vuoto assegni al campo_allegato in nome del vecchio file perche altrimenti ti rimane vuoto.
Questo può essere un base di codice tirato giù al volo e non controllato.
//attiva le funzioni di gestione file di joomla
jimport('joomla.filesystem.file');
// legge la directory degli allegati impostata nel form;
$MioForm =& CFChronoForm::getInstance("nome_tuo_form");
$uploadpath = $MioForm->formparams("uploadpath");
$vecchio=Jrequest::getVar('campo_nascosto','','post');
$nuovo=Jrequest::getVar('nome_allegato','','post');
if ($nuovo<>"") {
Jfile::delete($uploadpath.$vecchio);
} else {
Jrequest::setVar('nome_allegato',$vecchio,'post');
// oppure
unset($_POST['nome_allegato']);
//vedi qui quale funziona meglio.
}
-
<?php
jimport('joomla.filesystem.file');
$MioForm =& CFChronoForm::getInstance("scheda_sopralluogo_edit");
$uploadpath = $MioForm->formparams->uploadPath();
$vecchio=Jrequest::getVar('PathFile_0','','post');
$nuovo=Jrequest::getVar('PathFile_new','','post');
if ($nuovo<>"") {
Jfile::delete($uploadpath.$vecchio);
Jrequest::setVar('PathFile_0',str_replace(" ", "_", $nuovo));
$_FILES['file_0']['name'] = str_replace(" ","_", $nuovo));
} else {
}
?>
Grazie Vales per la tua risposta:
mi da questo errore:
Fatal error: Call to undefined method JParameter::uploadPath() in ***************/home/components/com_chronocontact/libraries/chronoform.php(258) : eval()'d code on line 4
E' chiaro che non trova uploadPath()....
Edit: ho sostituito alla variabile uploadPath() con il percorso di upload adesso non esegue più l'errore. Unica cosa che devo ancora verificare è il funzionamento della cancellazione del file dal server.
-
Oggi i test confermano i miei sospetti:
unica cosa che non fà è cancellare il vecchio file presente sul server.
-
Ecco il codice Funzionante:
<?php
jimport('joomla.filesystem.file');
$MioForm =& CFChronoForm::getInstance("scheda_sopralluogo_edit");
$uploadpath = "/components/com_chronocontact/uploads/scheda_sopralluogo_ver2/";
$vecchio=Jrequest::getVar('PathFile_0','','post');
$nuovo=Jrequest::getVar('PathFile_new','','post');
if ($nuovo<>"") {
if (file_exists ("components/com_chronocontact/uploads/scheda_sopralluogo_ver2/".$vecchio)){
Jfile::delete("components/com_chronocontact/uploads/scheda_sopralluogo_ver2/".$vecchio);
}
Jrequest::setVar('PathFile_0',str_replace(" ", "_", $nuovo));
$_FILES['file_0']['name'] = "Tecnico".JRequest::getString('nome_tecnico', '', 'post').'_'."Soggetto".JRequest::getString('cognome_sogg', '', 'post').'_'.JRequest::getString('nome_sogg', '', 'post').'_'.date('YmdHis').'_'.str_replace(" ","_",$nuovo);
$_POST['PathFile_0'] = $_FILES['file_0']['name'];
}
else {}
?>
NOn riesco a modificare il titolo del post per sostituire "problema" con "risolto"... cosa è un metodo di protezione del forum?
-
Ottimo.
Mi sembra di capire che usi un form con gli allegati nella cartella di un altro form, è per questo che non funzionava.
Per la modifica del titolo devi premere Modifica sul primo post.
-
Ottimo.
Mi sembra di capire che usi un form con gli allegati nella cartella di un altro form, è per questo che non funzionava.
Si... hai perfettamente ragione. La directory su cui fare i "lavori" è quella del form che si occupa di fare gli inserimenti.
Per la modifica del titolo devi premere Modifica sul primo post.
Non appare più il pulsante sul primo post.
-
....
Non appare più il pulsante sul primo post.
Forse non entri nel forum loggato?
-
Ho provato a sloggare e riloggare... non posso editare