Yii Framework Forum: $Model->Attributes=$_Post['newsletter'] Ignora I Valori Non Db - Yii Framework Forum

Jump to content

  • (2 Pages)
  • +
  • 1
  • 2
  • You cannot start a new topic
  • You cannot reply to this topic

$Model->Attributes=$_Post['newsletter'] Ignora I Valori Non Db Rate Topic: -----

#1 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 700
  • Joined: 03-October 12
  • Location:Ferrara

Posted 28 March 2013 - 08:39 AM

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) ..

Idee?
Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#2 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,987
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 28 March 2013 - 08:49 AM

Può essere che il formato di questo campo non sia valido? Puoi mostrarci il model?
0

#3 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 700
  • Joined: 03-October 12
  • Location:Ferrara

Posted 28 March 2013 - 08:57 AM

L'ho dichiarato così nella classe Newsletter

public $rcpt_address_list;  // stringa separata da virgola con gli indirizzi email


e come rules ho

array('rcpt_address_list', 'safe' ),



Ho verificato che inviando un qualsiasi testo questo provoca il popolamento corretto del relativo parametro $_POST

-- tutto qui --
Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#4 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 700
  • Joined: 03-October 12
  • Location:Ferrara

Posted 28 March 2013 - 09:01 AM

Aggiungo questo snippet

public function actionSend($id)
	{
		$model=$this->loadModel($id);

		$client = Yii::app()->user->getClient();

		if(isset($_POST['Newsletter']))
		{	
			Yii::trace( "actionSend POST" . print_r($_POST["Newsletter"], true), "mirko" );
			$model->attributes = $_POST['Newsletter'];
			
			$model->client_id = $client->id;
			if($model->save()) {

				$model->rcpt_address_list = $_POST['Newsletter']["rcpt_address_list"];

				Yii::trace( "actionSend newsletter attrs" . print_r($model->attributes, true), "mirko" );


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 ...
Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#5 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 700
  • Joined: 03-October 12
  • Location:Ferrara

Posted 28 March 2013 - 09:06 AM

Aggiungo un altra cosa assurda.

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 ?!
Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#6 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,987
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 28 March 2013 - 10:19 AM

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".
0

#7 User is offline   emafer 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 182
  • Joined: 23-February 12
  • Location:Amandola

Posted 28 March 2013 - 01:30 PM

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 :) )
1

#8 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 700
  • Joined: 03-October 12
  • Location:Ferrara

Posted 28 March 2013 - 03:32 PM

View Postemafer, on 28 March 2013 - 01:30 PM, said:

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 :) )


Accidenti, è vero, in passato mi ero già imbattuto in questa cosa...

Però ora che ho sperimentato volevo farvi sapere che
  • durante il set 'massivo' tutte le proprietà vengono settate. ... ma
  • .. NON vengono lette da model->attributes ...
  • ... ma SONO VALORIZZATE correttamente quindi $model->nome_variabile viene letta bene

Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#9 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,987
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 29 March 2013 - 05:46 AM

Ma LOL =)
0

#10 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 700
  • Joined: 03-October 12
  • Location:Ferrara

Posted 30 March 2013 - 10:17 AM

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 ...
Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#11 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,987
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 03 April 2013 - 05:24 AM

Nessuna incoerenza. Molto semplicemente va bene così =). Non puoi usare del codice aspettandoti da lui cose che non deve fare.
0

#12 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 700
  • Joined: 03-October 12
  • Location:Ferrara

Posted 03 April 2013 - 06:07 AM

beh, qui è solo una mia opinione, ma se il setAttribute li 'maneggia' tutti, non capisco perchè il getAttribute no, tutto qua.
Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#13 User is offline   emafer 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 182
  • Joined: 23-February 12
  • Location:Amandola

Posted 03 April 2013 - 06:14 AM

Probabilmente c'è un modo per inserire la nostra variabile aggiunta negli attributi, visto che CActiveRecord non ve la inserisce di default....
0

#14 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,987
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 03 April 2013 - 11:52 AM

E' questo il punto: non state seguendo l'Active Record: va aggiunto un campo al database.
0

#15 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,987
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 03 April 2013 - 11:53 AM

View Postrealtebo, on 03 April 2013 - 06:07 AM, said:

beh, qui è solo una mia opinione, ma se il setAttribute li 'maneggia' tutti, non capisco perchè il getAttribute no, tutto qua.


Magari sbaglio io, però tu fai il get di un attributo in un model che non ha quell'attributo nella tabella?
0

#16 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 700
  • Joined: 03-October 12
  • Location:Ferrara

Posted 03 April 2013 - 12:28 PM

si, effettivamente è così. . . forse ho capito
Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#17 User is offline   emafer 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 182
  • Joined: 23-February 12
  • Location:Amandola

Posted 03 April 2013 - 03:40 PM

View Postsensorario, on 03 April 2013 - 11:52 AM, said:

E' questo il punto: non state seguendo l'Active Record: va aggiunto un campo al database.

Ma se io ho bisogno si settare una variabile della classe che non va nel db?
0

#18 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,987
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 04 April 2013 - 12:00 AM

View Postemafer, on 03 April 2013 - 03:40 PM, said:

Ma se io ho bisogno si settare una variabile della classe che non va nel db?


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?
0

#19 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 700
  • Joined: 03-October 12
  • Location:Ferrara

Posted 04 April 2013 - 02:02 AM

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 computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#20 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,987
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 04 April 2013 - 05:40 PM

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.
0

Share this topic:


  • (2 Pages)
  • +
  • 1
  • 2
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users