Solite tre tabelle: Groups 1 -> N Users 1 -> N Report
Nell’admin dei Report ho una CGridView va a meraviglia, compresi i filtri tramite combo e l’ordinamento sul campo Group.name.
Ora sto lavorando per avere nel footer i totali.
Ho seguito questo topic inglese: http://www.yiiframework.com/forum/index.php?/topic/9636-cgridview-totals-or-summary-row
Praticamente ho creato una getSearchCriteria, che non fa altro che fare quello che faceva la search, mandando in return i CDbCriteria.
E così ancora tutto va
public function getSearchCriteria()
{
$criteria=new CDbCriteria;
$criteria->with = array ('user.group');
$criteria->compare('id',$this->id);
...
$criteria->compare('user.groupId',$this->groupI);
return $criteria;
}
public function search()
{
$criteria = $this->getSearchCriteria();
$sort = new CSort();
......
....
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
'sort'=> $sort,
'pagination' => array (
'pageSize' => '20',
),
));
}
anche così tutto funziona a meraviglia, e mi sembra anche più in ordine il codice
Ora vado nella view admin di Report e modifico UNA SOLA COLONNA della cgridview
array (
'name' => 'workOne',
'footer' => $model->sum('workOne'),
),
faccio refresh della admin e va tutto bene, il totale si vede, anche se la formattazione fa schifo e mi aspettavo che il widget facesse una riga di totali più belli,
Provo a filtrare per user.groupIp ed ottengo un sacrosanto errore SQL dovuto al fatto che la funzione di somma ora cerca di fare quanto segue:
SELECT SUM(workOne) FROM `tbl_reports` `t` WHERE users.groupId=:ycp1
La funzione di somma l’ho fatta così, anche se ovviamente essendo un copia/incolla non l’ho ben capito, ma ho ben capito l’errore SQL.
public function sum($nomeColonna)
{
$criteria=$this->getSearchCriteria();
$criteria->select= "SUM($nomeColonna)";
return $this->commandBuilder->createFindCommand($this->getTableSchema(),$criteria)->queryScalar();
}
Come mai i criteria, che usano il with (‘user.group’ ), non vengono considerati durante la funzione di somma ?
Come aggirare l’ostacolo ?