[RISOLTO] Perché se passo al render $test questa non viene vista dalla view?

[color="#222222"][font="Arial, sans-serif"][size="4"]Se un controller vuole renderizzare una view, passandole alcuni valori,[/size][/font][/color]

[color="#222222"][font="Arial, sans-serif"][size="4"]gli screencast ci insegnano che dobbiamo fare così:[/size][/font][/color]

[font="Arial, sans-serif"][color="#222222"][size=2]

[/size][/color][/font][color="#222222"][font="Arial, sans-serif"][size="4"][color="#222222"][font="Arial, sans-serif"][size="4"]


$this->render('contact',array('model'=>$model,'test' => 123));

[/size][/font][/color][/size][/font][/color]

[color="#222222"][font="Arial, sans-serif"][size="4"][color="#222222"][font="Arial, sans-serif"] [/font][/color][/size][/font][/color]

[color="#222222"][font="Arial, sans-serif"][size="4"][color="#222222"][font="Arial, sans-serif"][size="4"]Ma se ci provi, e nella view provi a stampare il valore di test[/size][/font][/color][/size][/font][/color]

[color="#222222"][font="Arial, sans-serif"][size="4"][color="#222222"][font="Arial, sans-serif"] [/font][/color][/size][/font][/color]

[color="#222222"][font="Arial, sans-serif"][size="4"][color="#222222"][font="Arial, sans-serif"][size="4"]


echo $test

[/size][/font][/color][/size][/font][/color]

[color="#222222"][font="Arial, sans-serif"][size="4"][color="#222222"][font="Arial, sans-serif"] [/font][/color][/size][/font][/color]

[color="#222222"][font="Arial, sans-serif"][size="4"][color="#222222"][font="Arial, sans-serif"][size="4"]otterrai un bel error 500 undefind variable error.[/size][/font][/color][/size][/font][/color]

[color="#222222"][font="Arial, sans-serif"][size="4"][color="#222222"][font="Arial, sans-serif"] [/font][/color][/size][/font][/color]

[color="#222222"][font=“Arial, sans-serif”][size=“4”][color="#222222"][font=“Arial, sans-serif”][size=“4”]Una spiegazione a questo rompicapo l’ho trovata nella wiki comprendere il flusso di rendering della view[/size][/font][/color][color="#222222"][font=“Arial, sans-serif”] [/font][/color][/size][/font][/color]

[color="#222222"][font="Arial, sans-serif"][size="4"][color="#222222"][font="Arial, sans-serif"] [/font][/color][/size][/font][/color]

[color="#222222"][font="Arial, sans-serif"][size="4"][color="#222222"][font="Arial, sans-serif"][size="4"]Ciò che non ho capito e che chiedo a chi più esperto di me, è:[/size][/font][/color][/size][/font][/color]

[color="#222222"][font="Arial, sans-serif"][size="4"]come si fa a risolvere il problema, usando Yii registry(params) o definendo qualche class field, così come proposto dalla guida?[/size][/font][/color]

Io ho sempre passato le variabili esattamente come hai mostrato nel tuo codice e sono sempre riuscito a stamparle. Mi potresti mostrare la tua pagina contact? Secondo me l’errore sta li. Se gli passi una variabile, e nella view non c’è, qualcuno li in mezzo l’ha eliminata. Altrimenti non avresti ne $model ne $test. E mi pare che il tuo problema sia solo su $test.

Eh, lo pensavo anch’io…

Ho anche imprecato contro Yii,

poi mi son detto:

"ma no, non può essere!

Sarà colpa dell’ultima release di php non ben supportata dal framework, che ultimamente incappo in questi problemi del piffero"

Finché ho dovuto cedere quando ho scritto questa view:




<?php

echo $crash;

echo $form->errorSummary($model);

die('qui non arriva');

?>



e questo controller:




$this->render('update',array('model'=>$modelSearch,'crash'=>'adesso si impalla'));



ed il link che ho postato, lo spiega abbastanza bene

quoto in pieno. Il problema mi si pone quando la view chiamata rimanda a una sottoview in cui printo (o se preferisci vardampo) la mia variabile, pertanto devo modificare il richiamo con l’aggiunta della mia variabile “test”.

Insomma: a me funziona come metodo, a meno che non abbia saltato un passaggio.

Cio’che dite e’ vero se non passo model. In quel caso posso passare tutte le variabili che voglio. Ma come aggiungo model… Crash!

Bella l’intuizione di Emafer. Effettivamente sto lavorando su _form che viene richiamato da update.php e create.php (classico crud di gii)

Domani provero’ a spostare la view direttamente in update come test.

Pero’ ribadisco la mia tesi.

Qualche problema deve pur esistere altrimenti non avrebbe senso l’esistenza di quella wiki.

confermo che se si lavora in una sottoview, la variabile va ripassata anche alla sottoview… almeno io faccio sempre così.

Esatto: la variabile viene passata alla view, dopodiché, se la stessa view ha delle renderPartial() al suo interno, deve nuovamente passare la variabile.

Confermo, il problema era dovuto al renderPartial in cui non avevo ripassato la variabile.

A questo punto, mi rimane solo il dubbio sulla spiegazione data dalla wiki:

http://www.yiiframework.com/wiki/249/understanding-the-view-rendering-flow/

Time for answers

[color=#222222][font=Arial, sans-serif][size=4]After we followed all the life cycle of the render method, we can answer to all the questions…[/size][/font][/color]

[color=#222222][font=Arial, sans-serif][size=4]1) why if I pass to the contact some $test variable like $this->render(‘contact’,array(‘model’=>$model,‘test’ => 123)); And I echo it in the layout with echo $test, I get error 500 undefind variable error?[/size][/font][/color]

[color=#222222][font=Arial, sans-serif][size=4]Answer: Because the parameters we pass to the $this->render method, are processed in the view file , in this example contact.php, and then we pass to the layout the generated view, and the variable $test is out of the scope for hte layout. What to do if you need it? you can use the Yii registry(params), or you can define some class field, or consider creating widget … (depends on the task)[/size][/font][/color]

[color=#222222][font=Arial, sans-serif][size=4]Chissà cosa intendevano…[/size][/font][/color]

Credo che intenda il file di layout (es. view/layout/main.php) perché altrimenti quello che dice è, per me, incomprensibile! :)

Ci sarebbe da ficcare il naso dentro alla logica di template di yii. Se ricordo bene, viene catturato l’output di pezzi di pagina. E si da il caso che il layout non esista mentre viene renderizzato un piccolo template. Ma il fatto è un altro: il layout non la view. Non si deve passare qualche cosa al layout nel modo tradizionale. Se lo si facesse, ogni singola action che utilizza una view che utilizza quel layout dovrebbe passare quella variabile. E non è che la cosa sia immediatamente utile.

Conclusioni: le variabili si passano alle view. Se si vuole fare qualche cosa nel layout, si sta sbagliando: quello che noi percepiamo come layout deve diventare una nostra view. Perché il controller vede le view, non i layout. E nella view, si utilizza il renderPartial.

L’ho spiegato malissimo. Ma spero sia arrivato il concetto.