Mi piacerebbe avere alcuni pareri su come gestire la creazione/modifica di una struttura dove la rappresentazione del "dato" viene fuori dalla relazione di due modelli.
Mi spiego, l’esempio è quello di una fattura o di un ordine dove c’è un modello che rappresenta i dati di intestazione (numero, cliente, totali, …) e uno che rappresenta i prodotti o servizi ordinati o fatturati (prodotto/servizio, quantità, costo unitario, etc…).
L’inserimento viene rappresentato da un’unica vista che va quindi a gestire la creazione di due tipologie di modelli differenti.
Le strade che ho pensato e provato fino ad ora sono:
[list=1]
[*]Creazione di un controller ad hoc che gestisce le action per l’inserimento di entrambi i modelli con relativa vista.
[*]Utilizzare solamente il controller "fattura" e quindi avere quello come riferimento per entrambi i modelli sia per le action che per le viste.
[*]Utilizzare il controller "fattura" per gestire solo le action del modello relativo e il controller "righeFattura" per gestire le action di inserimento/modifica delle righe; in questo caso però la vista è comunque sempre gestita dal controller fatture.
[/list]
Tutte e tre le soluzioni sono facilmente implementabili con Yii ma mi piacerebbe sapere qual’è, secondo voi, la soluzione più “elegante” o se avete utilizzato strade diverse.
in un progetto simile ho diviso ordini e fatture in due moduli distinti.
Entrambi i moduli , abbastanza simili ma non del tutto per utilizzarli con stesso controller e modelli, hanno una testata ed un dettaglio. Per generare l’intero documento(ordine o fattura o evasione o trasferimento) utilizzo un solo controller per riempire la testata e il relativo dettaglio.
Mi sembrano sostanzialmente equivalenti. La differenza è cos’altro dovresti gestire nel controller fattura.
Se il 100% di quello che gestisci nel controller fattura è relativo ai 2 model e alla view unica, di fatto coincide con la creazione di un controller ad hoc.
La soluzione 3 la vedo "apparentemente inutile" che va solo ad aumentare la complessità in generale e poi magari ti trovi a dover rimbalzare di continuo tra i due controller rischiando di perdere il "filo del discorso".
Era una vecchia discussione, comunque la soluzione che attualmente uso in un piccolo progetto è la 2
Il controller delle fatture si appoggia al modello fattura e rigaFattura, la rigaFattura non ha controller.
La soluzione 3 in realtà può avere una sua logica sopratutto se l’inserimento/modifica vengono fatti via Ajax, in questo caso il controller delle righe ordine si occupa esclusivamente della loro creazione/modifica e può essere riusato in vari contesti (es. se sono separate Fatture da Ordini o da modelli sostanzialmente simili).
Concordi?
Definire una logica per la struttura di un’app non è mai banale comunque!
In teoria (non ho mai avuto occasione di provare) se si utilizzano controlli lato client, forse l’inserimento/modifica potrebbe essere ideale utilizzare PJAX, per quello che ho letto di questa tecnologia.
Purtroppo non posso perché non è un progetto pubblico ma la view non è molto complicata.
Si tratta di una vista contenitore per la struttura della fattura, al suo interno richiama un altra vista con le righe della fattura, questa viene ricaricata via ajax quando si aggiungono, rimuovo o modificano righe.
Puoi anche utilizzare il widget Pjax fornito da Yii2, da un occhio a questo tutorial per le possibili implementazioni.
Io no ma la mia è una cosa un po’ particolare, se vuoi puoi usare tranquillamente gridview, nel tutorial che ti ho linkato c’è un esempio di pJax con gridview che è il seguente:
Forse mi sono spiegato male. A me interessa un modo per aggiungete righe di dettaglio all’ordine. L’ideale sarebbe una griglia che man mano mi consenta di inserire nuovi articoli