Problema $Model->Attributes Non Assegna I Valori

ciao a tutti,

Nel controller che completa la registrazione dei miei utenti ho scoperto che l’istruzione


$model->attributes=$_POST['CompleteForm'];

non assegna ai campi del mio model i parametri ricevuti dalla form.

In questo form ci sono solo 3 campi

  • username

  • password

  • email (nel form hidden field)

e nel model sono tutti disciplinati nel Rules()


array('username, password', 'required'),

array('username,password,email', 'safe'),



Ora, siccome l’account è già stato creato precedentemente con la sola mail, il mio scopo è quello di andare ad aggiornare gli altri due (username e password).

Per fare questo uso il seguente codice:




            $model = new CompleteForm;

            $email = $_POST['CompleteForm']['email'];


            /* queste le uso per sistemare manualmente il problema

            $username = $_POST['CompleteForm']['username'];

            $password = $_POST['CompleteForm']['password'];

            */

                                        

// carico i dati già presenti nel DB

$model=CompleteForm::model()->find("email=:postEMAIL", array(':postEMAIL'=>$email));

                            

//QUESTO E' IL COMANDO INCRIMINATO

$model->attributes=$_POST['CompleteForm'];


/*

queste le uso per sistemare manualmente il problema

$model->username = $username;

$model->password = $password;

*/		


$model->save();



Come avrete capito se uso il comando


$model->attributes=$_POST['CompleteForm'];

i campi username e password del $model non vengono aggiornati con i dati presenti nel form.

Ho letto che le variabili non specificate devono essere indicate come safe per cui ho aggiunto quella riga nel Rules(), ma non cambia il risultato.

Se invece imposto manualmente i campi prendendoli dal Post e settandoli nel $model, funziona tutto correttamente.

Avete qualche idea di che cosa sbaglio?

Ho anche pensato che ci possa essere un microdivario di tempo da quando lancio la retrieve dei dati dal DB e la riga successiva che assegna gli attributes, tale per cui in realtà prima si assegnano gli attributes e poi la $model viene popolata con i dati del DB che di fatto “sovrascrive” il $model con i valori originali. Ma forse sto vanificando… :(

Grazie x ogni consiglio e scusate ma con Yii ci lavoro da nemmeno 7 giorni.

Ma se fai solo:


$model = new CompleteForm;

$model->attributes=$_POST['CompleteForm'];     

$model->save();

ti salva correttamente?

se faccio in quella maniera non mi lancia il comando sql di Update ma di Insert.

Prova a gestire l’aggiornamento tramite updateByPk, usando l’id del record della tua tabella.

YourTable::model()->updateByPk($id, array(

'field1' => NewVal1,


'field2' => NewVal2

));

ci avevo pensato ma l’id del record non ce l’ho appresso, poichè il completamento della procedura di registrazione, parte dalla mail che l’utente riceve dove c’è solo:

  • email

  • activationkey

Per portarmi dietro questo valore dovrei modificare la mail che spedisco, il form di completamento e mi sembra cmq un modo alternativo di “aggirare” l’ostacolo senza capire come mai ho questo problema.

Inoltre se devo impostare un update del tipo:


CompleteForm::model()->updateByPk($id, array(

'username' => $_POST['CompleteForm']['username'],

'password' => $_POST['CompleteForm']['password']

));

Se domani ho un altro campo devo inserirlo manualmente, mentre con $model->attributes risolvevo tutto automaticamente con 1 istruzione.

Senz’alcun dubbio però usando update è più elegante che ne fare una Find e poi una Save.




// carico i dati già presenti nel DB

$model=CompleteForm::model()->find("email=:postEMAIL", array(':postEMAIL'=>$email));

                            

//QUESTO E' IL COMANDO INCRIMINATO

$model->attributes=$_POST['CompleteForm'];

Adesso non ho il tempo di addentrarmi nel codice e fare qualche prova, però quello che mi viene in mente è che potrebbe essere un problema di validation rules sui tuoi campi, nel model. Hai considerato l’eventualità?

Questione sicurezza: non so come hai implementato la gestione della double opt-in, ma occhio a eventuali problemi di sicurezza se hai deciso di gestire il tutto usando come parametro dentro il link l’indirizzo email in chiaro. Mi spiego: tipicamente per queste cose serve avere un token temporaneo da usare per riconoscere l’utente nel momento in cui clicca nel link per l’attivazione presente nella mail. Se hai quello, puoi recuperare il record dell’utente, senza hardcodare in chiaro l’indirizzo email (che è pubblico) dentro il link.