additional data in CGridView

For my music database I have a CGridView with pagination of one. How can I load additional data which are not in data model and not in $dataProvider? For instance I will fetch album cover from LastFM. Here is the Controller function:




        public function actionCover()

        {

                $artist = '';

                $title = '';

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

                        $artist=$_GET['artist'];

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

                        $title=$_GET['title'];


                Yii::import('application.extensions.lastfmapi.lastfmApiAuth');

                 $authVars = array(

                'apiKey' => '<my_LastFM_Api-Key'

                );

                $config = array(

                        'enabled' => true,

                        'path' => '../media/lastfmapi/',

                        'cache_length' => 1800

                        );

                $auth = new lastfmApiAuth('setsession', $authVars);


                // Call for the album package class with auth data

                $apiClass = new lastfmApi();

                $albumClass = $apiClass->getPackage($auth, 'album', $config);


                // Setup the variables

                $methodVars = array(

                'artist' => $artist,

                'album' => $title

                );

                if ($album = $albumClass->getInfo($methodVars) ) {

                       echo '<img src='.$album["image"]["large"].'>';

                }

                else {

                        die('<b>Error '.$albumClass->error['code'].' - </b><i>'.$albumClass->error['desc'].'</i>');

                }


                 return();

        }




My idea was a ajax call in CGridView for a virtual column in album model.

According to the MVC pattern, all the business logic should be placed inside a model. Therefore I suggest to move the code for fetching the covers to your model and store the urls in a virtual attribute. This way you can easily access all the covers inside your CGridView.

okay, my final solution for LastFM:

model:




   public function getCover()

   {

                Yii::import('application.extensions.lastfmapi.lastfmApiAuth');

                 $authVars = array(

                'apiKey' => '<my_lastfm_api_key'

                );

                $config = array(

                        'enabled' => true,

                        'path' => '../media/lastfmapi/',

                        'cache_length' => 1800

                        );

                $auth = new lastfmApiAuth('setsession', $authVars);


                $apiClass = new lastfmApi();

                $albumClass = $apiClass->getPackage($auth, 'album', $config);


                $methodVars = array(

                'artist' => $this->artist,

                'album' => $this->title

                );

                $album = $albumClass->getInfo($methodVars);

                if (empty($album["image"]["large"])) {

                     $album["image"]["large"] =  Yii::app()->request->baseUrl.'/images/noimage.png';

                }

                $coverimage = $album["image"]["large"];

            return($coverimage);


   }


        public function bsearch()

        {

                $criteria=new CDbCriteria;


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

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

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

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

                return new CActiveDataProvider(get_class($this), array(

                        'criteria'=>$criteria,

                'pagination'=>array(

                        'pageSize'=>5

                ),

                ));




controller:




        public function actionBlatt()

        {

                $model=new Alben('search');

                $model->unsetAttributes(); 

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

                        $model->attributes=$_GET['Alben'];

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

                'model'=>$model,

        ));

        }



view:




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

        'id'=>'alben-grid',

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

        'filter'=>$model,

        'columns'=>array(

                array(

                        'name'=>'cover',

                        'type'=>'image',

                ),

                'discnr',

                'dtyp',

                'title',

                'artist',


        ),

));

?>




As enhancement I will also build in an IMDB search because there are also movies in the database.

K.