Quantcast
Channel: Yii Framework Forum
Viewing all articles
Browse latest Browse all 18717

GridView Filtering of Relational Data

$
0
0
Hi Everyone,

I am having trouble getting the GridView to display filters for relational data. I am trying to manage a TopDestination model, that holds a list of location IDs. The TopDestination model is related to a Location model as follows:

TopDestination Model:
	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(
			'location' => array(self::BELONGS_TO, 'Location', 'location_id'),
		);
	}


Location Model:
	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(
			'carHireSearchSessions' => array(self::HAS_MANY, 'CarHireSearchSession', 'pick_up_location_id'),
			'carHireSearchSessions1' => array(self::HAS_MANY, 'CarHireSearchSession', 'drop_off_location_id'),
			'topAirport' => array(self::HAS_ONE, 'TopAirport', 'location_id'),
			'topDestination' => array(self::HAS_ONE, 'TopDestination', 'location_id'),
		);
	}


I have created the admin view to manage TopDestinations, and I have added the Location data to the GridView as follows:

Admin View:
<?php $this->widget('zii.widgets.grid.CGridView', array(
	'id'=>'top-destination-grid',
	'dataProvider'=>$model->search(),
  'filter' => $model,
  'columns'=>array(
    array(
        'name' => 'location_id',
    ),
    array(
        'name'=>'location.location_title',
        'value'=>'$data->location->location_title',
        'filter'=>CHtml::listData(Location::model()->findAll(), 'id', 'location_title'),
            'htmlOptions'=>array('width'=>'90px'),
    ),

    array(
      'name' => 'location.city_title',
    ),
    array(
      'name' => 'location.airport_code',
    ),
    array(
      'class'=>'CButtonColumn',
    ),
	),
)); ?>


Here is how the admin function looks in my TopDestination Controller:

TopDestination Controller:
	public function actionAdmin()
	{
	  //$locations = TopDestination::model()->with('location')->search();
		$model=new TopDestination('search');
    
    //$locations =  TopDestination::model()->with('location')->findByPK($model->location_id);
  
    // Only show the active records
    $model = $model->active();
    
		$model->unsetAttributes();  // clear any default values
		
		//$model->with('location');


    //fb($locations);
    
		if(isset($_GET['TopDestination']))
			$model->attributes=$_GET['TopDestination'];

		$this->render('admin',array(
			'model'=>$model,
			//'locations'=>$locations,
		));
	}


And here is the search function in the TopDestination Model:

TopDestination Model:
	public function search()
	{
		// Warning: Please modify the following code to remove attributes that
		// should not be searched.

		$criteria=new CDbCriteria;
    fb($this);
		$criteria->compare('t.location_id',$this->location_id,true);
    $criteria->with = 'location';
    $criteria->compare('location.location_title', $this->location);
    $criteria->addSearchCondition("location.location_title",$this->location->location_title); // This line does not work - 'trying to get property of non object' error
    $criteria->together = TRUE;


		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
		));
	}


I cannot get the GridView to display filters for any of the Location data. Only the filter for location_id displays.

Does anyone know what I am missing? I have a feeling it is in the search criteria, but I am unable to get any criteria to work for the fields coming from the Location model!

Your help is much appreciated :)

Viewing all articles
Browse latest Browse all 18717

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>