Order by dei campi relazionati

[font="Georgia"]Buonasera a tutti,

premetto che uso da poco il framework,ma lo trovo molto smart e duttile.

cmq, ecco il mio problema/quesito sul "sortable" dei campi:

mi trovo di fronte ad una delle più classiche tabelle generate da CGridView, gli items sono il risultato di 2/3 models che sono relazionati tra loro, tramite "relations()" appunto.

ho notato che i campi direttamente derivati dal model "principale" sono automaticamente ordinabili, mentre quelli derivati dalle relazioni no.

ho girato un pò nei vari forum,wiki etc ma finisco sempre col perdermi :o

sapete dirmi una soluzione alla cosa?

Grazie in anticipo![/font]

PS: se dovesse servire qualche printScreen per spiegarmi meglio, la posterò subito, ma credo che il problema si spieghi da solo…

Ciao, scrivo qui la mia soluzione, dovesse servire a in futuro a qualcun’altro:

allora la mia situazione era un pò diversa da quella tipica trovata praticamente in tutti i tutorials e posts in giro, la mia CGridView stampa a video il risultato di 3 models dove una colonna era il risultato di una associazione tramite una tabella associativa, vi posto l’img che parla + di 1000parole.

2831

tab_associativa.jpg

praticamente fatto i 3 models tramite gii, le ralations erano già impostate a livello di databases(foreignKeys e cose del genere) quindi ha fatto tutto yii in fase di scrittura.

quindi nel model principale “AnagraficaRichieste” c’è la seguente relazione:


			'statiRichiestes' 	=> 	array(self::HAS_ONE, 	'StatiRichieste', 		'idrichieste'),

poi nel model "StatiRichieste" che è della tabella associativa ho la seguente relazione:


			'idRichiesteAssociate' => array(self::BELONGS_TO, 'AnagraficaRichieste', 'idrichieste'),

			'idStatiPerLabel' => array(self::BELONGS_TO, 'Stati', 'idstati'),

il Wiki che ho seguito, e che è fondamentale leggere per proseguire, è questo ma qui si parlava di 2 tabelle io invece ne ho 3…

praticamente ho trovato la soluzione cambiando le cose nel creare l’oggetto DataProvider in search():


	public function search()

	{

		// Warning: Please modify the following code to remove attributes that

		// should not be searched.

		$criteria=new CDbCriteria;


		$criteria->with = array('statiRichiestes.idStatiPerLabel');

		$criteria->together = true;

		$criteria->condition="author = '".Yii::app()->user->username."'";

		$criteria->compare('idStatiPerLabel.nome_stati',$this->order_by_stato,true);

		

		$criteria->compare('tipologia_attivita',$this->tipologia_attivita);

		$criteria->compare('author',$this->author,true);

		$criteria->compare('contatti_author',$this->contatti_author,true);

		$criteria->compare('ip_author',$this->ip_author,true);

		$criteria->compare('oggetto_chiamata',$this->oggetto_chiamata,true);

		$criteria->compare('data_richiesta',$this->data_richiesta,true);

		$criteria->compare('html_richiesta',$this->html_richiesta,true);

		$criteria->compare('operatore',$this->operatore);


		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

			'sort'=>array(

				'defaultOrder'=>'data_richiesta DESC, idrichieste_ai',	

				'attributes'=>array(

					'order_by_stato'=>array(

						//*** prima sbagliando ci inserivo statiRichiestes.idStatiPerLabel.nome_stati

						//*** invece x funzionare bisogna togliere 'statiRichiestes'

						'asc'=>'idStatiPerLabel.nome_stati',

						'desc'=>'idStatiPerLabel.nome_stati DESC'

					),

					'*'

				)

			),

			'pagination'=>array(

				'pageSize'=>15

			)

		));

	}

e quindi il controller:


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

				array(

					'dataProvider'=>$model->search(),//$dataProvider,

					//'filter'=>$model,

					'columns'=>array(

						'idrichieste_ai',

						array(

							'name'=>'order_by_stato',

							'value'=>'$data->statiRichiestes->idStatiPerLabel->nome_stati'

						),

						array(

							'name'=>'tipologiaAttivita.nome_attivita'

						),

						'oggetto_chiamata',

						'author',

						array(

							'name'=>'data_richiesta',

							//*** formatField è una funzione che ho messo nel model 'AnagraficaRichieste'

							'value'=>array('AnagraficaRichieste','formatField'),

						)

					)

				)

			);

praticamente sbagliavo inserendo nella definizione dell’oggetto sort dentro search anche il nome della relations “statiRichiestes” mentre è sufficiente solo la relations definita nel model del campo che vogliamo sortare:

errore = "relazione_tabella_1.relazione_tabella_associativa.nome_campo_da_sortare"

esatto = "relazione_tabella_associativa.nome_campo_da_sortare"

dimenticavo, notare anche il "with" dove è necessario esplicitare il legame tra la relazione1(del model principale) e la relazione2(del model della tab.associativa)


$criteria->with = array('statiRichiestes.idStatiPerLabel');



spero sia utile a qualcuno,

ciao.

Ps. se ci sono errori e/o consigli o altre soluzioni fatemi sapere pur, e Grazie in anticipo. :D

Bello, mi è servito.

zii.widgets.grid.CGridView è in grado di gestire il multi ordinamento?

In pratica mi piacerebbe dare la possibilità all’utente di ordinare la griglia prima per il campo A e poi per il campo E (order by A,E)

poi per un’esigenza successiva l’utente ordina prima per il campo B e poi C (order by B,C)

infine decide di ordinare solo per il campo F (order by F)

Qualcuno ha già affrontato l’esigenza?

C’e’ un apposito parametro di CSort

Nella search imposta:


return CActiveDataProvider('ModelClass', array(

  ...

  'sort'=>array('multiSort'=>true)

));

Funziona alla grande.

E se poi l’utente volesse resettare l’ordinamento?

Come deve procedere?

Perché adesso giustamente ordina per qualsiasi colonna io clicchi.

Al momento ho risolto aggiungendo nella view un tasto del genere:




<?php echo CHtml::button('Nuova Ricerca', array('submit' => array('controller/action'))); ?>



ma magari esiste un modo più furbo.

Anche io metto un bottone, non ci sono molte alternative