مشکل در فیلتر Grid View

[size="4"][font="Tahoma"][rtl]با سلام خدمت همه اساتید

من یک گراید ویو دارم که از دوتا جدول اصلاعات میگیره

مثلا نام و نام خانوادگی از جدول یوزر

و نمره ها از جدول نمره

برای نمایش مشکلی ندارم

اما هنگام فیلتر مشکل داره و فیلتر نمیشه.

بی زحمت کسی در این رابطه آموزش یا مثالهایی داره لطف کنه و من رو راهنمایی کنید[/rtl][/font][/size]

[right][rtl][font="Tahoma"]

سلام

شما باید تابع search مدل یوزر رو تغییر بدید

من یک مثال میزنم که در اون لیست خبرها در گریدویو نشون داده میشه و دسته خبرها هم از یک جدول دیگه خونده میشه و تو جدول نشون داده میشه

قبل از هرچیز relation بین خبر و دسته خبر رو ایجاد میکنیم

[/font][/rtl][/right]




	/**

	 * @return array relational rules.

	 */

	public function relations()

	{

		return array(

			'category' => array(self::BELONGS_TO, 'Category', 'category_id'),

		);

	}



[right][rtl][font="Tahoma"]

بعدش توی گریدویو به این صورت عنوان دسته خبر رو در سطر خبر نمایش میدیم. البته فکر کنم تا این مرحله رو انجام دادید

باید کد زیر رو به عنوان یکی از سطر های گریدویو به array سطر ها اضافه کنید

[/font][/rtl][/right]




array(

	'name' => 'category_id',

	'value' => '$data->category->title',

	),



[right][rtl][font="Tahoma"]

تا الان عنوان دسته به صورت صحیح نمایش داده میشه اما سرچ به درستی کار نمیکنه

کار اصلی در تابع search مدل خبر انجام میگیره:

[/font][/rtl][/right]




	public function search()

	{

		$criteria=new CDbCriteria();

		$criteria->with = array('category');

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

		$criteria->compare('category.title',$this->category_id);

		

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

			'criteria'=>$criteria,

		));

	}



[right][rtl][font="Tahoma"]

اینجوری باید کار کنه

حالا خودتون این مثال رو تبدیل کنید به مورد کاربران و نمره که سوال شماست ;)

[/font][/rtl][/right]

من انجام دادم متاسفانه نمیشه




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(

                    'user'=>array(self::BELONGS_TO,'Users','code_personeli')

		);

	}




بعد تابع




public function allHokm()

        {

            $users= $this->userData();

            $criteria=new CDbCriteria;

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

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

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

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

            if(Yii::app()->user->getState('level')==100)

            {

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

            }

            else

            {

                $criteria->condition='user.code_personeli=<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/tongue.gif' class='bbc_emoticon' alt=':P' />';

                $criteria->params=array('<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/tongue.gif' class='bbc_emoticon' alt=':P' />'=> $users->code_personeli);

            }

            $criteria->with=array('user');//*/

            $criteria->compare('user.name',$this->code_personeli,true);

			$criteria->compare('user.name_khanevadegi',$this->code_personeli,true);

			$criteria->compare('user.name_pedar',$this->code_personeli,true);

		

            //return Hokm::model()->findAll('code_personeli=:id',array(':id'=>$users->code_personeli));

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

			'criteria'=>$criteria,

						'sort'=>array(

							'defaultOrder'=>'t.tarikh_ejra DESC',

						),

                        'pagination'=>array(

                            'pageSize'=>20,),

		)); //*/

        }



و در نهایت قسمت ویو




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

	'id'=>'hokm-grid',

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

	'filter'=>$model,

        'blankDisplay'=>'مشاهده حکم',

     

	'columns'=>array(

		   array(

                        'type'=>'raw',

                        'value'=>'CHtml::link(($row+1), array("#", "id"=>$data->id));',

                        'header'=>'ردیف',

                        ),

		'code_personeli',

		//'user.name',

		array(

        'name' => 'code_personeli',

        'value' => '$data->user->name',

		'header'=>'نام',

        ),

		

		//'user.name_khanevadagi',

		array(

        'name' => 'code_personeli',

        'value' => '$data->user->name_khanevadagi',

		'header'=>'نام خانوادگی',

        ),

		

		//'user.name_pedar',

		array(

        'name' => 'code_personeli',

        'value' => '$data->user->name_pedar',

		'header'=>'نام پدر',

        ),

		

        'noe_hokm',

        'tarikh_ejra',

		'tarikh_sodoor',

		'shomare_hokm',




                   array(

                            'class'=>'CButtonColumn',

                            'template'=>'{view}',

                            'viewButtonUrl'=> //'CHtml::link("", array("/hokm/view", "id"=>$data->id), array("target"=>"_blank"))',

                                            'Yii::app()->createUrl("/hokm/view", array("id" => $data["id"]))',

                             'viewButtonOptions'=>array("target"=>"_blank"),

                            //'deleteButtonUrl'=>'Yii::app()->createUrl("/hokm/delete", array("id" =>  $data["id"]))',

                            //'updateButtonUrl'=>'Yii::app()->createUrl("/hokm/update", array("id" =>  $data["id"]))',

                          ),

	),

)); ?>




نمایش داده میشه به خوبی هم نشون میده

اما فیلترش کار نمیکنه

هرچی میزنم هیچی زی فیلتر نمیکنه

لطفا راهنمایی کنید ممنون

[right][rtl][font="Tahoma"]

مشکل اینجاست شما اومدی برای نام و نام خانوادگی و نام پدر از code personeli به عنوان name استفاده کردی

باید سه تا attribute مختلف ست بشه تا کار کنه

[/font][/rtl][/right]




                //'user.name',

                array(

        'name' => 'user_name',

        'value' => '$data->user->name',

                'header'=>'نام',

        ),

                

                //'user.name_khanevadagi',

                array(

        'name' => 'user_lastname',

        'value' => '$data->user->name_khanevadagi',

                'header'=>'نام خانوادگی',

        ),

                

                //'user.name_pedar',

                array(

        'name' => 'user_fathername',

        'value' => '$data->user->name_pedar',

                'header'=>'نام پدر',

        ),






            $criteria->with=array('user');//*/

            $criteria->compare('user.name',$this->user_name,true);

            $criteria->compare('user.name_khanevadegi',$this->user_lastname,true);

            $criteria->compare('user.name_pedar',$this->user_fathername,true);



[right][rtl][font="Tahoma"]

فقط باید اون سه تا attrbute ک من نوشتم رو توی مدل تون تعریف کنید. کافیه بعد از تعریف کلاس بنویسید public $user_name و …

اگه بازم مشکل داشت یا ارور داد بگید

[/font][/rtl][/right]

[font="Tahoma"][rtl]دوست عزیز دستتون درد نکنه

انجام دادم همه ی فیلتر ها به درستی کار کرد ولی فقط سه فیلتر

نام و نام خانوادگی و نام پدر کار نمیکنه

!!!!!!!!!!!!!!!

در ضمن sort برای همه موارد به خوبی کار میکنه به جز این سه مورد

sort: زمانی که روی هدر کلیک میکنیم منظورم هستش

[/rtl][/font]




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

	'id'=>'hokm-grid',

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

	'filter'=>$model,

        'blankDisplay'=>'مشاهده حکم',

     

	'columns'=>array(

		   array(

                        'type'=>'raw',

                        'value'=>'CHtml::link(($row+1), array("#", "id"=>$data->id));',

                        'header'=>'ردیف',

                        ),

		'code_personeli',

//'user.name',

		array(

        'name' => 'user_name',

        'value' => '$data->user->name',

		'header'=>'نام',

        ),

		

		//'user.name_khanevadagi',

		array(

        'name' => 'user_lastname',

        'value' => '$data->user->name_khanevadagi',

		'header'=>'نام خانوادگی',

        ),

		

		//'user.name_pedar',

		array(

        'name' => 'user_fathername',

        'value' => '$data->user->name_pedar',

		'header'=>'نام پدر',

        ),






 public function allHokm()

        {

            $users= $this->userData();

            $criteria=new CDbCriteria;

			$criteria->compare('t.noe_hokm',$this->noe_hokm,true);

			$criteria->compare('t.tarikh_ejra',$this->tarikh_ejra);

			$criteria->compare('t.tarikh_sodoor',$this->tarikh_sodoor);

			$criteria->compare('t.shomare_hokm',$this->shomare_hokm);

            if(Yii::app()->user->getState('level')==100)

            {

                $criteria->compare('t.code_personeli',$this->code_personeli);

            }

            else

            {

                $criteria->condition='t.code_personeli=<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/tongue.gif' class='bbc_emoticon' alt=':P' />';

                $criteria->params=array('<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/tongue.gif' class='bbc_emoticon' alt=':P' />'=> $users->code_personeli);

            }

            $criteria->with=array('user');

            $criteria->compare('user.name',$this->user_name,true);

			$criteria->compare('user.name_khanevadagi',$this->user_lastname,true);

			$criteria->compare('user.name_pedar',$this->user_fathername,true);

		

            //return Hokm::model()->findAll('code_personeli=:id',array(':id'=>$users->code_personeli));

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

			'criteria'=>$criteria,

						'sort'=>array(

							'defaultOrder'=>'t.tarikh_ejra DESC',

						),

                        'pagination'=>array(

                            'pageSize'=>20,),

		)); //*/

        }






class Hokm extends CActiveRecord

{

	public $user_name;

	public $user_lastname;

	public $user_fathername;



[font="Tahoma"][rtl]سلام با لاخره مشکل رو فهمیدم با توی قسمت کمنترل این خط کد هم اضاف کنم[/rtl][/font]




public function actionIndex()

	{


            $model= new Hokm('allHokm');

			$model->unsetAttributes();  // clear any default values

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

                        {

                            //print_r($_GET['Hokm']);

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

                            $model->user_name=$_GET['Hokm']['user_name'];

                            $model->user_lastname=$_GET['Hokm']['user_lastname'];

                            $model->user_fathername=$_GET['Hokm']['user_fathername'];

                        }

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

			'model'=>$model,));


             

	}




[font="Tahoma"][rtl]

حالا فقط یه مشکل هستش اون هم قسمت sort روی تمام گزینه ها اگه قسمت هدرش کلیک کنم sort میشه ولی روی سه قسمت نام - نامخانوادگی- نام پدر غیر فعال هستش و سورت نمیشه

لطفا راهنمایی کنید.

ممنون

[/rtl][/font]

[right][rtl][font="Tahoma"]

آقا میبخشی من به اینترنت دسترسی نداشتم یه مدت

یه چیزی رو یادم رفت بگم، اشکال کار از اون جاست

این ۳ تا attribute که اضافه کردیم رو باید به متد rules کلاس هم اضافه کنیم. باید در سناریوی search به صورت safe تعریف شده باشند

این کارو ک انجام بدید دیگه به اون سه خطی که در کنترلر اضافه کردید هم نیازی نیست

امیدوارم دیگه همه چیش کار کنه :)

[/font][/rtl][/right]

[font="Tahoma"][rtl]خواهش میکنمدست شما هم درد نکنه عالی بود جست و جو به خوبی کار کرداما باز همون مشکل sort وجود داره و نمیشه انجام دادیعنی توی قسمت این سه تانمیشه کلیلک کرد که سورت بشن[/rtl][/font]

[rtl]

[font="Tahoma"]

ببین اصولا وقتی داری از join های این شکلی استفاده می کنی که مثلا userid رو تو جدولت داری و می خوایی اسمش رو نشون بدی

پیشفرض خود yii کاری به value شما نداره میره بر اساس مثلا همون userid میچینه

مگر اینکه خودت بهش بگی رو این ستون برو این sort رو انجام بده که می گم

[/font]

[/rtl]




return new CActiveDataProvider($this, array(

            'criteria'=>$criteria,

		    'sort' => array(

			    'attributes'=>array(

				    'user_lastname'=>array(

					    'asc'=>'user.name_khanevadagi ASC',

					    'desc'=>'user.name_khanevadagi DESC',

				    ),

				    '*',

			    ),

			    'defaultOrder' => 't.tarikh_ejra DESC',

		    ),

        ));