Ce l’ho fatta!!!
(ho trovato un post di qualche tempo fa di zaccaria e mdomba nel forum inglese)
Così ho saputo correggere il mio codice in questo modo:
MODEL:
nel model si deve prima creare la relazione e poi aggiungerla nelle regole
public function rules() {
return array(
array('nome, citta', 'required'),
array('citta', 'numerical', 'integerOnly' => true),
array('nome', 'length', 'max' => 50),
array('id, nome, citta, cittadina', 'safe', 'on' => 'search'),
);
}
/**
* @return array relational rules.
*/
public function relations() {
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
'cittadina' => array(self::BELONGS_TO, 'Citta', 'citta'),
);
}
VIEW:
Nel CGridView bisogna aggiungere un array ed indicare il nome della relazione, il filtro da usare ed il valore.
<?php
$this->widget('zii.widgets.grid.CGridView', array(
'id' => 'paesi-grid',
'dataProvider' => $model->search(),
'filter' => $model,
'columns' => array(
'id',
'nome',
array(
'name' => 'cittadina',
'filter' => CHtml::activeTextField($model, 'cittadina'),
'value' => '$data->cittadina->nome',
),
array(
'class' => 'CButtonColumn',
),
),
));
?>
CONTROLLER:
Infine nel controller bisogna fare si che la ricerca vada a ficcare il naso nella tabella esterna.
public function search() {
$criteria = new CDbCriteria;
$criteria->compare('nome', $this->nome, true);
$criteria->compare('cittadina.nome', $this->cittadina, true);
$criteria->join = 'join citta on citta.id = t.citta';
$criteria->with = array('cittadina');
return new CActiveDataProvider(get_class($this), array(
'criteria' => $criteria,
));
}
Per completare questo post, ci aggiungo anche il Dump del mio database nel caso qualcuno volesse provare questo esempio per conto proprio come ho fatto io:
CREATE TABLE IF NOT EXISTS `citta` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
INSERT INTO `citta` (`id`, `nome`) VALUES
(1, 'Cesena'),
(2, 'Roma');
CREATE TABLE IF NOT EXISTS `paesi` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(50) NOT NULL,
`citta` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
INSERT INTO `paesi` (`id`, `nome`, `citta`) VALUES
(1, 'San Carlo', 1),
(2, 'San Vittore', 1),
(3, 'Trastevere', 2);
TESTATO E FUNZIONANTE!