5 soluzioni a problemi che sicuramente incontrerai su Yii

5 soluzioni a problemi che sicuramente incontrerai su Yii

1636
0
CONDIVIDI

Yii è un potente Framework basato su PHP, essendo un fork racchiude tutto il meglio preso da altri framework non solo PHP (ruby on rails, ad esempio). Durante lo sviluppo ho cercato di individuare 5 problematiche che più o meno incontro ad ogni progetto e che sicuramente saranno utili anche per voi risolvere.

Impostare un controller di base

Impostare un controller di base, è un’azione che spesso vi capiterà di fare. Vediamo in che modo:

modificare il file config/main.php

'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
'name'=>'My Web Application',
'defaultController' => 'controller/azione', //riga da aggiungere

Modificare il data provider con condizione

E’ possibile modificare il flusso dei dati all’interno della grid view di default, passando, ad esempio un parametro in GET. Nell’esempio eseguo una query che mi permetterà di filtrare la griglia in base all’id

creo un nuovo data provider…

$where_condition = 'id= ' . $_GET["id"];
 
$dataProvider = new CActiveDataProvider('NomeController', array(
	'criteria'=>array(
	    'condition' => $where_condition,
	    'order' => 'id'
	 ),
	 'pagination'=>array(
	     'pageSize'=>20,
	 ),
));

…e lo passo all’interno del widget che mostrerà i dati (in questo caso una Grid View)

$this->widget('zii.widgets.grid.CGridView', array(
	'id'=>'controller-meta-grid',
	'dataProvider'=>$dataProvider,
	'filter'=>$model,
	'columns'=>array(
		'id',
		'nome',
		array(
			'class'=>'CButtonColumn',
		),
	),
));

Aggiungere un pulsante nella GridView

Capita spesso di dover realizzare, all’interno di una GridView, pulsanti che richiamano azioni custom. In questo esempio ho bisogno di aggiungere un pulsante “elenco”.
All’interno dell’array che richiama la classe “CButtonColumn” inserire il seguente codice:

<!--?php [...] array( 'class'=&gt;'CButtonColumn',
    'template' =&gt; '{update}{elenco}',
    'buttons' =&gt; array(
         'elenco' =&gt; array(
         'label' =&gt; 'Elenco',
         'url' =&gt; 'CHtml::normalizeUrl(array("controller/elenco", "id" =&gt; $data-&gt;id))',
                 'imageUrl' =&gt; Yii::app()-&gt;baseUrl . '/images/ico-elenco.jpg',
         ),
    ),
),
[...]
?-->

Oltre ad aver introdotto un nuovo pulsante “elenco”, ho anche specificato quale degli altri standard (update, delete, view) devo mostrare, in questo caso ho scelto di mostrare solo “update”, se invece non avessi bisogno di mostrare un pulsante custom ma solo alcuni dei bottoni standard, avrei dovuto fare:

<!--?php [...] array( 'class'=&gt;'CButtonColumn',
    'template' =&gt; '{update}{delete}'
),
[...]
?-->

Cosi facendo ho deciso di escludere il bottone “view”.

Visualizzare un’immagine nella griglia “CGridView”

CGridView è una classe di Yii che offre la possibilità di mostrare in griglia i dati di una query, la troviamo di default nelle viste di “admin” dopo aver effettuato le operazioni CRUD. L’oggetto di default mostra le informazioni in maniera testuale, può capitare, invece, di avere la necessità di mostrare un’immagine. Ecco come fare:

[...]
   'columns'=&gt;array(
	   'titolo',
           'autore',
	    array(
               'type' =&gt; 'raw',
               'value' =&gt; 'CHtml::image(Yii::app()-&gt;baseUrl . "/uploads/" . $data-&gt;immagine,"",array("style"=&gt;"width:190px;height:220px;"))',
           ),
)
[...]

Nel mio caso, richiamo un campo “immagine” all’interno del database che contiene l’indirizzo relativo della foto da stampare a video e, successivamente, assegno delle dimensioni fisse.

Personalizzare i messaggi di errore

Potrebbe essere utile personalizzare i messaggi di errore; solitamente Yii imposta di default una messaggistica standard che è possibile modificare all’interno del modello:

default:

public function rules()
{
	return array(
              array('username, password', 'required')
	);
}

diventa:

public function rules()
{
	return array(
              array('username, password', 'required', 'message'=&gt;'Inserisci {attribute}.')
	);
}