[Risolto][Yii 1] Aggiornare Più Record Con Unico Form

Buongiorno, seguo da un po’ il forum ma questo è primo thread che apro anche se ho già postato su qualche altro thread, per cui un po’ mi presento visto che non l’ho fatto prima.

Sono vecchiotto (57 compiuti) e da circa metà febbraio ho “scoperto” Yii per necessità lavorative. Precedentemente ho programmato in PHP, ma solo in tempi recenti (niente OOP), iniziando per necessità (sito di un amico da creare da zero) e passione (mi ci sono messo d’impegno). E ciò mi ha portato a finire per lavorare nel campo, visto che nel frattempo il mio lavoro originario (tecnico HW) è andato a farsi friggere. In pratica sono partito con Yii subito dopo aver preso in mano questo progetto.

Devo dire che non è stato il massimo dover iniziare subito con un progetto complesso, ma per farsi le ossa a volte bisogna rompersele.

In pratica si tratta di un progetto che al momento ha 36 tabelle (con relazioni più o meno complesse), la maggior parte convertite da una struttura realizzata da un pinco pallino in VB della quale non si ha il sorgente ma che dovrei tentare di replicare analizzando cosa fa (mi faccio gli auguri da solo). Non entro nei dettagli perché sarebbe inutile. Finora comunque me la sono cavata.

Ora la “cosa”, l’oggetto dei miei pensieri: dovrei fare una vista nella quale viene ricavato il n. di record da una tabella (nessun problema) ed “aprire” il corrispondente numero di record per un editing simultaneo in un unico form. In pratica, poniamo di avere una tabella che contiene i seguenti campi: Nome, Cognome, Anno. Il numero che abbiamo poniamo che sia 4: dovrei quindi caricare altrettanti record e quindi ottenere i campi di editing per Nome, Cognome, Anno e poi ancora Nome, Cognome, Anno e così via per un totale, in questo esempio, di 4 volte.

In fondo al form avrei un unico tasto di submit che dovrebbe quindi sottomettere 4 record simultaneamente. In realtà la cosa è più complessa perché dovrebbero venire sottomessi anche dei record di tabelle diverse, ma non credo che ciò rappresenti un problema.

La domanda che mi/vi pongo:

E’ possibile sottomettere più record della medesima tabella senza che Yii si incasini (mi viene da pensare che possano esserci problemi di omonimia di campi o altro)?

In caso che ciò sia fattibile (e penso che qualsiasi cosa, sapendolo fare, lo sia) dovrei adottare qualche accorgimento particolare o mi limito a seguire l’ispirazione andando a sbattere con il naso contro la parete della realtà come faccio di solito? :D

Ciao,

riprendendo il tuo esempio… nel controller inserirei le 4 istanze che ti servono in un array e cercherei di gestirle come in questo esempio.

Gli inserimenti sono singoli quindi non dovrebbero incasinarti la tabella

Sì, grazie, domani faccio le prove. Tra l’altro nell’esempio che mi hai indicato (che mi pare di aver già visto mentre cercavo) si indica più o meno come intendevo fare io. Niente, domani provo e vedo cosa ne esce.

Aggiornamento - Risolto:

Visto che ho già più form nella pagina (uno principale dal quale posso scegliere da un menù a tendina il n. di record da editare ed il form appunto dei record da editare) ho deciso che a questo punto potevo farne ancora di più.

In sostanza ho fatto tanti form di input (senza submit, in pratica delle righe con i campi che mi servono).

In pratica la baracca lavora così:

  1. form principale sul quale tra le altre cose c’è un menù a tendina (popolato da altra tabella);

  2. cliccando sul menù a tendina viene fatta una richiesta Ajax al controller il quale ritorna ciò che serve per visualizzare i form sotto. In pratica viene caricata in un DIV una pagina dove i vari form sono creati con un ciclo for così posso avere quelli che mi servono.

  3. C’è un tasto submit cumulativo sotto a tutto. Cliccandolo si avvia uno script che fa il submit in sequenza dei vari form via Ajax, così la pagina non viene ricaricata.

  4. Per ultimo viene fatto il submit del form principale. Questo nella maniera classica, non Ajax, così la pagina viene ricaricata e vengono rinfrescate alcune cose che sarebbe stato complesso aggiornare altrimenti.

La pagina è comunque velocissima e non ci si accorge che si tratta di form multipli. Perfetto! All’utilizzo sembra un unico form. Ho inoltre usato setFlash per notificare il salvataggio dei dati, sennò spesso nemmeno ci si accorge che la pagina viene aggiornata.

E qui mi sono anche imbattuto in una specie di bug di questa funzionalità che faceva sì che il messaggio apparisse a volte sì ed a volte no. Cercando ho trovato anche la soluzione: un’impostazione da fare nel file di configurazione dell’applicazione.

In caso di errore nella compilazione del form principale la gestione è quella solita di Yii, per i form multipli invece devo ancora vedere come farla perché è complessa nel senso che i valori validi dipendono da altre tabelle e non sono fissi. C’è da dire comunque che forse solo uno o 2 campi sono complessi, gli altri sono da menù a tendina e quindi i dati sono già “predigeriti”. Ma queste cose le devo ancora finire.

Per intanto questo che mi preoccupava è stato risolto.

Grazie per la pazienza di seguire questi miei “poemi”! :D

Ciao Sergio , ho seguito questo post perchè interessa anche a me

ti dispiacerebbe condividere del codice :) , ti saluto

Certo, solo che è incasinato e non ho ancora risolto alcune cose perché sono andato dietro ad un bug che alla fine era dovuto al fatto che le chiamate ajax erano asincrone ed ho dovuto impostarle come sincrone affinché il tutto funzioni bene.

Devo ancora mettere una validazione come si deve per i form multipli ma non è facile sia per la mia esigenza (i valori della combinazione di 3 campi devono essere unici se diversi da null o da zero) che per il fatto che, avendo record multipli, Yii associa loro gli stessi ID e quindi una segnalazione di errore per un qualsiasi campo andrebbe ad evidenziare sempre il campo corrispondente del primo form.

Bisognerebbe per forza riuscire a creare un form con ID diversi, l’ideale sarebbe avere un unico form per tutto, dove però possano venire sottomessi simultaneamente sia più record di una tabella che uno di un’altra tabella.

Vedrò di fare prove anche in tal senso.

Se verrà bene farò una versione semplificata del tutto perché venga più didattico perché se posto il codice così com’è è un casino.

http://www.yiiframework.com/wiki/362/how-to-use-multiple-instances-of-the-same-model-in-the-same-form/

tra le tante ricerche notturne , domani ci provo

Alla fine sono riuscito a fare tutto con un unico form.

Mi ha illuminato questo articolo.

Ci ho lavorato fino ad adesso vista la complessità delle mie esigenze, ma funziona perfettamente senza fare barbatrucchi particolari.

Ora mi manca solo la validazione di un campo che è un po’ rognosetta in quanto sono 3 campi che devono essere unici nel loro insieme meno uno di loro nel caso sia null. Se non ci verrò fuori nei prossimi giorni casomai aprirò un nuovo topic.