How To Exclude Item From Chtml::listdata?

I have categories with subcategories and getting list of root categories in new category creation/update form. The list is CHtml::dropDownList. Data are in CHtml::listData. The problem is that when I’m editing root category I’m having this category itself available as option in drop-down list. How do I get rid of it?

Hi,

You have to filter using query itself, during fetching from database just filter this (Example) select * from category where subcategory != ‘main’




//Define criteria

$criteria=new CDbCriteria(); 

$criteria->compare('status',Post::STATUS_ACTIVE); 

echo CHtml::listData(State::model()->findAll($criteria), 'status_id', 'status_name');



Thank you! But is there a way to do this trick inside of CGridView array element?

Sorry, I did not catch your question. Maybe you can describe it in more details.

in CGridView, if you want to use dropdown list as filter, you can do like this:




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

'columns'=>array(

//'reference_number',

		array(

			'name'=>'reference_number',

			'value'=>'$data->reference_number',

			'filter'=>CHtml::listData($model->findAllBySql('SELECT reference_number

				FROM insurance_form

				GROUP BY reference_number ORDER BY reference_number'), 'reference_number', 'reference_number'),

		),

...



It will create a drop down list filter in the first quick search row. All values is from your current table, and options ordered by reference number.

if you want to see more examples about related fields, see:

http://www.yiiframework.com/forum/index.php/topic/8148-cgridview-filter-with-relations/

Hello.

Please check out this article.

Our Answer


//in 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(

			'carservicetypedetail' => array(self::BELONGS_TO, 'Carservicetypedetail', 'carservicetypedetail_id'),

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

			

		);

	}


//in controller

public function actionDynamiccarservicetypedetails()

        {

                $data=Carservicetypedetail::model()->findAll('carservicetype_id=:carservicetype_id', 

                        array(':carservicetype_id'=>(int) $_POST['carservicetype_id']));


                $datas=CHtml::listData($data,'id','slug');

                

                $dataii=CHtml::listData($data,'id','id');

                

                $criteria = array(

                        'select'=>'*',

                        'condition'=>'`user_id`=:user_id', 

                        'params'=>array(':user_id' => Yii::app()->user->id)

                );

                $dataCs = Carservice::model()->findAll($criteria);

                $dataCsii=CHtml::listData($dataCs,'carservicetypedetail_id','carservicetypedetail_id');

                

                $dataii = array_diff($dataii, $dataCsii);//exclude iSystems

                

                foreach($dataii as $value=>$name)

                {

                        echo CHtml::tag('option',

                                array('value'=>$value),CHtml::encode($datas[$value]),true);

                }

        }

Hello,

Please create a function in model file. And call that function in Cgridview.

Example.

Function in model.

public function getUsernames(){

return CHtml::listData(self::Model()-&gt;findAll(),'id','name');


}

#########################################

In cridview call this function "$model->usernames".

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

'id'=&gt;'user-grid',


'dataProvider'=&gt;&#036;model-&gt;search(),


'filter'=&gt;&#036;model,


'columns'=&gt;array(


	'id',


	  array(


			'name'=&gt;'name',


			'value'=&gt;'&#036;data-&gt;name',


			'filter'=&gt;&#036;model-&gt;usernames,


			'type'=&gt;'raw',


	),


	array(


		'class'=&gt;'CButtonColumn',


	),


),

)); ?>

Thanks