Template a blocchi

Salve mi stò avvicinando da poco a questo framework e dopo aver letto sia il cookbook che ‘Agile Web Application Dev with Yii 1.1 and Php5’ mi manca un pezzo o forse non ho compreso bene l’argomento.

L’argomento è il LAYOUT che a quanto pare non sembra permettere la gestione di + blocchi in una singola pagina, ma solo inclusioni stile matrioske (uno dentro l’altro).

Il mio intento è gestire nella stessa pagina più richieste contemporaneamente (un grafico, una gridview, etc…) come è possibile ottenere ciò con Yii ?

grazie in anticipo

Dentro ad una view, puoi scrivere




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

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



e così via. Occhio: in questo modo richiami il template grafico o gridview del controller attuale. Se vuoi specificare anche il controller devi indicare




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

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



dove "ciao" corrisponde al nome del controller.

PS. puoi sempre estendere yii con twig o smarty. Io preferisco rimanere nell’uso dei template php. Mi trovo molto bene.

Concordo sull’utilizzo di php per quanto riguarda i template, dunque nella view principale (quella dell’index.php) posso richiamare diversi templates ? Per template si intende la proprietà Layout del controller vero ? Quindi personalizzare il layout ad ogni controller che intendo usare come componente dell pagina principale.

Ho inteso bene ? grazie

Credo possa esserti utile sapere una cosa molto importante che riguarda i layout. Prendiamo una richiesta "base" ovvero index.php?r=site/index. Il codice che verrà richiamato sarà nel controller SiteController che si troverà nella cartella /protected/controllers. Abbiamo il layout e la view e sono indicati nel commento.




class SiteController {

	public function actionIndex()

	{

		// renders the view file 'protected/views/site/index.php'

		// using the default layout 'protected/views/layouts/main.php'

		$this->render('index');

	}

}



Il layout protected/views/layouts/main.php ad un certo punto ha un pezzetto di codice del tipo <?php echo $content; ?> in cui verrà renderizzato il contenuto di $this->render(‘index’) che corrisponde a protected’/views/site/index.php.

Detto questo, ti dico un paio di cose che potrebbero esserti utili. Guarda il prossimo snippet:




class SiteController {

        public $ciaoMondo;

	public function actionIndex()

	{

                $this->ciaoMondo = 'ciao';

		$this->render('index', array(

                        'ciao' => 'mondo

                ));

	}

}



Sia dentro al layout che alla view, sarà possibile usare la variabile $this->ciaoMondo. Al contrario, SOLO dentro alla view, sarà possibile usare una variabile $ciao.

Oltre a questo, aggiungo che SiteController, come tutti i controller che avrai, estende la classe Controller (che a sua volta estende CController). Controller la trovi dentro a /protected/component/Controller.php mentre CController fa parte del framework.

Se ti serve avere dei blocchi all’interno del tuo template, ti consiglio un paio di cose

  • dentro al layout utilizza <?php echo $this->nomeBlocco; ?>

  • Per ogni blocco, definisci una variabile pubblica dentro alla classe Controller

Perfetto mi hai chiarito il livello di visibilità delle variabili, grazie, però sbaglio o così dovrò gestire tutto da un unico Controller ? E quindi ritrovarmene uno corposissimo, pieno di funzioni … e di models (per i database)

La mia pagina conterrà molti widget (all jQuery based) dunque avrò da fare continue richieste asincrone (Ajax) allo stesso Controller.

Chi e come si gestiscono le chiamate di tipo ajax (con Yii)?

Grazie

E’ sempre jquery che le esegue. Devi controllare CHtml::ajaxLink nella documentazione.




<?php echo CHtml::ajaxLink(

  "testo del link ajax",

  Yii::app()->createUrl( 'controller/action' ),

  array( 

    'type' =>; 'POST',

    'success' => "function( data ) { alert( data ); }"

  ),

); ?>



Interessanti anche le potenzialità con la grafica, dovrò fare un pò di esperimenti. Anch’io ho le stesse esigenze di paskuale.

Ne approfitto per chiedere una dritta.

Ho realizzato una mini applicazione didattica di cui ho pubblicato anche i sorgenti e volevo provare a modificarne la grafica arrotondando gli angoli delle edit box.

Da quello che ho capito, basta usare jquery e scrivere un codice simile a questo:




<input type="text" id="nome" class="name ui-corner-all">



ma dato che yii usa una sua sintassi particolare per costruire i controlli, mi chiedevo se fosse in qualche modo possibile dirgli di aggiungere:




class="name ui-corner-all"



Insomma nessuno ha un esempio + completo e + chiaro di come gestire tutto da una unica index.php ?

Insomma quello che si fà senza un framework ma con gli <?php include_once(‘file_da_includere’);?> con Yii che si fà ?

Grazie

paskuale, questo framework implementa l’MVC non puoi usare una sola index =).

con yii devi usare $this->renderPartial(‘controller/action’);

Ecco quello che temevo … dunque posso avere una index dove faccio solo e sempre 1 azione(Controller/Model/View) ?

Non posso gestire dei report …delle tabelle riepilogative… una lista dei nuovi iscritti. Nella stessa pagina ? :( che tristezza …

Per chi conosce il famoso joomla un pò come le position dove caricare i moduli … si può con Yii ?

Grazie a tutti.

Beh ma nello stesso index però posso fare varie chiamate ajax senza cambiare Url…

ciao =)

sensorario ho seguito i tuoi consigli, ma sbaglierò in qualcosa.

Ho creato un controller, all’interno della sua view (index) ho aggiunto questo rigo:


$this->renderPartial('site/contact');

ma mi restituisce un CExeption … praticamente con questa riga dovrei vedermi caricato il contact form nativo del framework dentro la mia nuova view!

Ciao e grazie ;)

non so se ho ben capito quello che vuoi fare, ma ci provo: io ho realizzato una applicazione che aveva un’unica pagina composta da 3 blocchi di codice html caricati con chiamate ajax.

Per questioni di gestione permessi e diversificare i controller ne ho utilizzati 3. Le chiamate ajax nella index principale (vedi #7 di sensorario) chiamano le varie funzioni action dei controller ed il fatto che siano chiamate ajax cambia solo il metodo di renderer utilizzato nella action, che deve essere appunto renderPartial per non caricare tutto il layout. RenderPartial carica un file php in cui avrai la view restituita alla chiamata ajax.

La cosa è + semplice farla che non spiegarla, però un minimo di documentazione leggila, altrimenti rischi di perdere un sacco di tempo nel cercare di fare cose semplici, ma ben documentate.

L’alternativa è mettere pezzi di codice di questo tipo nel layout.php:


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

Quindi creare una cartella /protected/views/blocks … e così via.

Beh che dire … forse non era un framework mvc che cercavo ma qualcosa che mi aiutasse a snellire il lavoro ripetitivo della programmazione iniziale, ho deciso di fare da me … classi personalizzate e stop, alla fine questi MVC servono (sembrerebbe) per siti blog style, per chi deve organizzare una web.app il tempo per apprendere un nuovo framework è troppo, come dire … “l’impresa non vale la spesa” torno sui miei passi a farmi un pò di OOP + grezzo ma perlomeno ho il controllo totale su quello che faccio e quello che mi serve.

Buon proseguimento a tutti e grazie =)

Anch’io sono stato tentato di abbandonare l’impresa piu’ di una volta. Ma poi ho resistito perche’ sono convinto che alla lunga, recuperero’ il tempo iniziale e poi andro’ piu’ veloce della luce. O almeno lo spero.

Sarei curioso di confrontare la tua soluzione con yii.

Per far funzionare questo dovevi usare


$this->renderPartial('//site/contact');

Nota il "//"

Io vi ringrazio tutti per i consigli e le preziose info, ma potreste ‘sbottonarvi’ un pò di più nelle spiegazioni se non chiedo molto :) ?

Non è una pretesa sia ben chiaro, ma se volete invogliare la crescita di questo frmwork (che mi stà simpatico lo ammetto) non bisogna sciupare 15 post di un topic per capire solo una riga e scoprire dopo una decina che lo slash era doppio e non singolo …

Forse mancano delle demo funzionanti oltre al bel alvoro di traduzione della guida ufficiale.

Beh non è niente di straordinario, solo una cozzaglia di classi fatte su misura alle mie esigenze, che non hanno i vantaggi di un MVC indubbiamente, e forse meno light di un MVC, ma mi lasciano libero dagli schemi, posso fare quello che voglio dentro una pagina, nel mio caso (una sorta di pannello di controllo) non posso limitarmi a [una richiesta= un controller=una azione per pagina] ma bensi [una richiesta=una risposta+tanti widget/files intorno aggiornati con ajax eventualmente].

Ribadisco la mia personale simpatia verso Yii ma non era quel che cercavo forse.

Un saluto a tutti e buona programmazione =)