Ho un model ‘Newsletter’ che oltre ai campi di db contiene una proprietà pubblica ‘rcpt_address_list’, che è poi solo una stringa
Ho verificato che sull’azione post il campo viene spedito come Newsletter[“rcpt_address_list”], nella stessa nomenclatura POST degli altri.
Quando però effetto
$model->attributes=$_POST['Newsletter'];
questo attributo NON viene impostato.
Ho già verificato che nella vista della form il nome del campo è corretto, così come ho verificato che sia in ‘safe’ (e comunque non ho alcun problema segnalato nei log) …
Si noti che nel primo “trace” ci sono i POST e qui il valore di rcpt_address_list compare, dopo il save però non c’è più, e non serve a nulla neppure assegnarlo a forza ! Non capisco… e sono certo che sarà una sciocchezza …
Se dopo il model->save() invece di fare il redirect a view faccio un render di ‘update’, ottengo che TUTTI i campi sono popolati … quindi … nel model c’è anche questo attributo, ma ancora una volta, facendo il print_r di $model->attributes NON compare… cosa sto ignorando ?!
Mi sfugge ancora qualche cosa. Hai provato con qualche cosa del tipo:
if(!$model->save()) {
echo $mode->errors();
}
Non ricordo se errors è un metodo o un attributo, però può aiutarci a capire se "passa" questo metodo.
Un altra cosa da controllare è questa: mi è capitato di creare dei model e successivamente di modificare il tipo di dato. Nel model era, per esempio, impostato ‘integerOnly’ => true mentre io cercavo di inserire un valore alfanumerico. Il risultato finale si riconduceva sempre a “0”.
Le variabili settate non fanno parte degli attributi,
che vengono generati in base al db e inseriti nell’array _attributes
La variabile esterna rimane settata, giustamente, ma non inserita nell’array, perciò $model->attributes non funziona (mi pare che la funzione SetAttributes richiamata cicli i valori dell’array e prenda solo quelli già presenti)
Per settare la voce devi farlo direttamente. (o perlomeno io faccio così, se troviamo soluzioni migliori meglio )
eh, già, piccola incoerenza… stavo pensando di creare uno snippet e segnalare al cosa su github al core team di Yii, ma se qualcuno più esperto di me lo volesse fare …
Bene, puoi scrivere tranquillamente i tuoi getter e setter. Però esci dalla logica del ActiveRecord secondo me. Vedi tu. Dovrai importare gli attributi in un modo quando fanno parte della tabella e quell’attributo dovrà/potrà essere calcolato. Io posso capire quando viene generato un form, ma come fai a recuperare quel dato per esempio in una view? Come lo recuperi?
Ci sono moltissimi casi in cui si ha bisogno di avere un campo esterno al DB nella vita reale.
Ho un modulo di invio di dati, che prevede dei modelli presalvati, quindi il 99% dei dati è precaricato.
Potrei farmi un CFormModel, ma effettivamente mi raddoppia il lavoro, allora faccio la form basata su un ActiveRecord ed aggiungo solo un paio di campi che cambiano ad ogni submit ma non devo salvarli.
Questo giusto per fare un esempio.
Comunque è decisamente mooooolto possibile che data l’esperienza non pluriennale con Yii io abbia sbagliato approccio, però non posso, tutte le volte, riscrivere parti intere dell’app. Sarà per la prossima, tanto se ne sforna una nuova ogni tre mesi.
Il caso è interessante. Se poi mi dici che ti può capitare spesso, analizziamo meglio il problema e troviamo una soluzione una volta per tutte. Magari con un wiki o altro. Però a me in questo momento sfugge la necessità di avere un form con dati che non devono essere salvati.