problema con la funzione render

Ciao a tutti. spero di essere chiaro e sintetico e sopratutto che sappiate darmi una risposta definitiva per risolvele il mio problema.

allora il mio obbiettivo è quello di avere una view dentro un layout formata come nel file allegato movimenti.txt

$table_movimenti: è una tabella descritta in una subview

$table_banche: sarebbe un’altra tabella ma per semplicità è una sibview con semplicemente un echo ‘ANNO=’.$year;

e in fine c’è la action in actionMovimenti.txt

il mio obbiettivo è quello di visualizzare l’anno che ho selezionato nel filtro della tabella descritta in $table_movimenti nella variabile $year.

la prima volta che entro nella schermata la tabella è visualizzata e il valore passato a $year è NULL e fin qui tutto ok.

il problema è che una volta selezionato il filtro nella tabella la action è chiamata ancora, la variabile $mov è aggiornata con le nuove righe filtrate, la variabile $bank è uguale a ANNO=2012 (ad esempio ho selezionato 2012), PERO’ il render della pagina mostra la tabella corretta ma il valore ANNO=NULL, cioè il valore iniziale della variabile!

Lo stesso accade se forzo il valore passato. Ad esempio al caricamento metto 2000, lui renderizza 2000, ed ok, poi cuna volta azionato il filtro lo forzo a 3000 però lui mi renderizza comunque 2000 e non 3000.

Qualcuno sa dirmi dove può essere il problema?? io utilizzo Firebug e tutto è ok!! la renderPartial visualizza correttamente il dato tanto che in $bank il valore è corretto!! però con il render quel valore non è modificato!!

come mai??

ringrazio tutti per l’attenzione!!

spero di avere una risposta definitiva perchè è più di una settimana che ci batto la testa e non ho trovato soluzione

Non ho capito =). Mi dipiace Stefano ma io non capisco cosa chiedi =). Tu che cosa intendi per filtro? I filter in Yii sono una cosa ben precisa. Potreti anche scrivere il codice nel post invece di allegare files. Ci rendi difficile aiutarti così. Stai cercando di proporci la tua soluzione, ma il problema io non lo comprendo. Non comprendo davvero che cosa vuoi fare.

Il tuo primo obiettivo sembra questo:

  1. allora il mio obbiettivo è quello di avere una view dentro un layout formata come nel file allegato movimenti.txt

Beh, io fossi in te non farei tante renderPartial dentro al controller. Io fossi in te le renderPartial le scriverei dentro alla view. Così un Controller fa la sua render. Questa render, avrà dentro se le sue renderPartial.

Il secondo obiettivo sembra questo:

  1. il mio obbiettivo è quello di visualizzare l’anno che ho selezionato nel filtro della tabella descritta in $table_movimenti nella variabile $year.

Ti giuro che non capisco che cosa vuole dire. Come hai fatto a selezionare il filtro? Che cosa è un filtro per te? In che senso filtro della tabella? Sei nel CGridVIew? Stai palando di una combo?

Un pezzo di codice vale molto più di mille parole Stefano. Ti suggerisco di postarti il codice. E di dirci solo che cosa ti aspettavi.

Ciao, ti ringrazio per la rapida risposta. in effetti per la foga di dire il più possibile alla fine non si capisce nulla.

cercherò di essere il più chiaro possibile.

Io ho una View mostrata nel file allegato view movimenti.jpg formata nel seguente codice:

movimenti.php




<?php

$this->pageTitle=Yii::app()->name . ' - Movimenti';

?>


<h1>Movimenti</h1>


<?php echo CHtml::link('Inserisci Nuovo Movimento','#',array('class'=>'search-button')); ?>

<div class="search-form" style="display:none">

<?php //$this->renderPartial('_search'); ?>

</div>


<div id="mov_table">

	<?php

	   echo $table_movimenti;	

	?>

</div>		

		

<div id="bank-table"> 

	<?php

           echo $table_banche;	

	?>

</div>



come si può notare ho diviso la mia view in due subview nei due file seguenti:

_movimenti.php (che mostra la tabella)




<?php

	$formatvalue = new FormatValue;

		$tot_conti = $modelMovimenti->total_sum();


		$this->widget('zii.widgets.grid.CGridView', array(

			'id'=>'table-movimenti-grid',

			'dataProvider'=>$modelMovimenti->search(),

			//'beforeAjaxUpdate'=>'function(id,data){filter_year();}',

			'filter'=>$modelMovimenti,

			'columns'=>array(

				'id_associazione',

				array(

					'name'=>'data',

					'filter'=>$modelMovimenti->listadate(),

				),

				'descrizione',

				array(

					'name'=>'id_banca',

					'value'=>'$data->idBanca->descrizione',

					'filter'=>$modelMovimenti->listabanche(),

				),

				array(

					'name'=>'importo',

					'filter'=>FALSE,

					'footer'=>$formatvalue->floattostring($tot_conti),

				),

				array(

					'name'=>'id_conto',

					'value'=>'$data->idConto->descrizione_conto',

					'filter'=>$modelMovimenti->listaconti(),

				),

				array(

					'header' => 'Azioni',

					'class'=>'CButtonColumn',

					'template'=>'{view}{update}{delete}',

				),	

			),	

		));


?>



_banche.php (mostra semplicemente la stringa)




<?php

	echo 'ANNO = '.$year;

?>



il tutto viene controllato dall’actionMovimenti() qui di seguito:




public function actionMovimenti() 

	{	 

		

		$model = new TableMovimenti;

		$model->unsetAttributes();

		

		if(isset($_GET['TableMovimenti']))

			$model->attributes=$_GET['TableMovimenti'];

			

		$mov = $this->renderPartial('_movimenti',array('modelMovimenti'=>$model),TRUE);

		$bank = $this->renderPartial('_banche',array('year'=>$model->data),TRUE);		

	

		$this->render('movimenti',array('table_movimenti'=>$mov,'table_banche'=>$bank));

	}



Nell’immagine view movimenti.jpg allegata si può vedere il risultato della actionMovimenti() e fin qui tutto bene. (NOTA: la stringa ANNO = NULL è corretta perchè all’inizio il valore passato $model->data è NULL).

A questo punto agisco sul filtro della colonna data e seleziono l’anno (es. 2012).

Una volta selezionato l’anno, l’acitonMovimenti() viene richiamato e il modello $model viene ricreato e vengono assegnati i vari attributi (in questo caso solo l’attributo data).

Il problema si presenta ora, perchè la variabile $bank presenta il valore corretto "ANNO = 2012", come mostrato nel debug allegato, però la mia view non mostra questo dato ma continua a mostrarmi "ANNO = NULL".

Invece la tabella è filtrata e aggiornata correttamente.

Come si può spiegare questo fatto? non riesco proprio a visualizzare nessun valore in "ANNO =".

Ribadisco che il valore $model->data è passato correttamente come mostrato nel debug.

QUESTO E’ IL MIO PROBLEMA… E NON CAPISCO DOVE SIA L’ERRORE.

spero che qualcuno riesca a darmi una spiegazione logica a questo fatto.

grazie a tutti e spero sia chiaro sta volta il mio problema

ciao

Domanda: tu conosci ajax?

se intenti conoscere nel senso fare una chiamata ajax tramite jquery sì.

Se intenti conoscere quello che fa la tabella quando seleziono l’anno un pochino meno.

Mi sembra di aver capito che hai individuato il problema! giusto?

Non lo so bene: continui a scrivere cose che mi disorientano. Se tu mi posti del codice e mi dici "mi aspettavo A ed invece ho visto B". Io posso dirti "Non vedi B perchè …".

Nel tuo caso, invece, posti del codice ma poi mi racconti tutti i tuoi dubbi. Io non so più quali dubbi risolvere. Scusami.

il dubbio che non so risolvere è perchè nel codice postato non viene passata la variabile nel render…

quello è l’unico mio problema.

poi ho fatto io delle prove mie per vedere se riuscivo a trovare la soluzione ma niente.

nel problema postato con il codice ti descrivo passo passo quello che faccio, quello che ottengo e quello che invece vorrei ottenere.

ovviamente dimmi pure quello che non riesci a capire…

messo nei tuoi termini e tenendo presente il codice postato io ottengo, una volta filtrata la tabella

"ANNO =" e invece dovrei ottenere "ANNO = 2012" dove 2012 è il valore conentuto in $model->data.

questo è il problema!

Se ho capitto bene l’anno si seglie nei filter del CGridView…

Il "problema" e che tutto questo viene eseguito con un richiamo ajax dal codice jquery.yiigridview.js (metodo update)… qualunque cosa sia restituita, soltanto le parti necesarie al CGridView vengono aggiornate nella pagina originale…

per aggiungere altre parti della pagina si usa ajaxUpdate - http://www.yiiframework.com/doc/api/1.1/CGridView#ajaxUpdate-detail

Percio nel tuo esempio il _banche.php potrebbe essere


<div id="banche_anno">

<?php echo 'ANNO = '.$year; ?>

</div>

E poi il tuo CGridView sarebbe




$this->widget('zii.widgets.grid.CGridView', array(

    'id'=>'table-movimenti-grid',

    'ajaxUpdate'=>'table-movimenti-grid, banche_anno',

    ...



GRAZIE MDOMBA!!

E’ PROPRIO QUELLO CHE MI SERVIVA

PROBLEMA RISOLTO!:slight_smile: