Cgridview : Afficher Une Somme De Données D'une Table Liée

Bonjour à tous,

Je rencontre actuellement un problème avec le widget CGridview.

Voici le diagramme simplifié de mes données :

En résumé, ce système permet de créer des transactions “Transaction” qui contiennent un à plusieurs éléments (par exemple, “Achats d’aliments”, “Loyer”, etc.) qui ont chacuns un coût.

Chaque transaction est créée par une personne "User".

Finalement, une transaction est assignée “Assignment” à une ou plusieurs personnes. L’assignement permet de définir qui à payé combien de pourcentage de la transaction.

Sur une des pages de mon application, je souhaite, sur la base du modèle "Assignment", afficher les informations suivantes :

  • Assignment->id

  • Assignment->Transaction->date

  • Assignment->User->pseudo

  • Assignment->percent

  • Assignment->Transaction->description

  • array_sum(Assignment->Transaction->Item->debit)

J’arrive à tout afficher sauf la dernière ( array_sum(Assignment->Transaction->Item->debit) ). Le but est d’afficher sur chaque ligne le coût total de la transaction (par la suite, l’idéal serait d’ailleurs d’afficher le coût total pour une personne, en multipliant la somme des “debit” par le pourcentage “percent”).

Comment puis-je faire?

Voici les essais que j’ai effectué sans succès :

Controller:




<?php


class NameController extends GxController {




	// ...

        

    public function actionCGridview() {

		$model = new Assignment('search');

		$model->unsetAttributes();


		if (isset($_GET['Assignment']))

			$model->setAttributes($_GET['Assignment']);


		$this->render('test', array(

			'model' => $model,

		));

	}


}



View :




<?php


// ...


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

	'id' => 'transaction-grid',

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

	'filter' => $model,

	'columns' => array(

		'id',

		array(

				'name'=>'transaction_id',

				'value'=>'GxHtml::valueEx($data->Transaction)',

				'filter'=>GxHtml::listDataEx(Transaction::model()->findAllAttributes(null, true)),

				),

		array(

				'name'=>'user_id',

				'value'=>'GxHtml::valueEx($data->User)',

				'filter'=>GxHtml::listDataEx(User::model()->findAllAttributes(null, true)),

				),

		'percent',

		array(

            'name' => 'Transaction',

            'header'=>'Description',

            'value' => '(($data->Transaction)?$data->Transaction->description:"")',

        ),

		array(

            'name' => 'Transaction.Item.debit',

            'header'=>'Sum',

            'value' => '(($data->Transaction->Item)?array_sum($data->Transaction->Item->debit):0)',

        ),

		

		array(

			'class' => 'CButtonColumn',

		),

	),

));


?>



Modèle Assignment :




<?php


class Assignment extends GxActiveRecord {


	// ...


	public function relations() {

		return array(

				'User' => array(self::BELONGS_TO, 'User', 'user_id'),

				'Transaction' => array(self::BELONGS_TO, 'Transaction', 'transaction_id'),

		);

	}


	public function search() {

		$criteria = new CDbCriteria;


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

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

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

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

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

		

		$criteria->compare('Transaction.description', $this->transaction_id);

		$criteria->compare('Transaction.Item.debit', $this->Transaction->Item->debit);


		return new CActiveDataProvider($this, array(

			'criteria' => $criteria,

		));

	}

}



Modèle Transaction :




<?php


class Transaction extends GxActiveRecord {


	// ...


	public static function representingColumn() {

		return 'date';

	}

	

	public function relations() {

		return array(

			'Assignment' => array(self::HAS_MANY, 'Assignment', 'transaction_id'),

			'Item' => array(self::HAS_MANY, 'Item', 'transaction_id'),

			'user' => array(self::BELONGS_TO, 'User', 'user_id'),

		);

	}

	

	// ...


}



Un grand merci d’avance pour votre précieuse aide.

Bonjour,

Lorsque j’ai eu a faire un tableau récapitulatif (avec des colones de totaux), j’ai simplement créer une méthode dans mon modèle qui me ressort le totale via une requete sql.

Ensuite j’utilisais cette méthode dans le CGridView, il existe peut-être une meilleurs méthode, mais en tout cas ça fonctionne