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
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.