Cgridview Custom Filed

[right]

سلام

یه ستون اضافه کرد که نه توی جدول باشه و نه توی مدل ؟ CGridView چطور می شه به

[/right]

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

سلام

برای این کار باید اول یک پراپرتی دلخواه به کلاس مدل تون اضافه کنید

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




class YourClass extends CActiveRecord

{

	public $customField;

..

..


}



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

و بعد کافیه در gridView مثل یک ستون عادی باهاش برخورد کنید و مقادیر مناسب رو بهش نسبت بدید:

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




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

		array(

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

			'filter'=>$model,

			'columns' => array(

			          'title',

				  'description',  

                                  ..

				  array(

				  	'name' => 'customField',

				  	'value' => ' "whatever you want" ',

                                        'filter' => false,

				  	),  

                                  ..

			)

		); 



[right]

خوب مشکل من اینه که نمی خوام به پروپرتی سوری تعریف کنم

تعریف کنم image مثلا اگه من بخوام به ستون عکس اضافه کنم باید یه پروپرتی به نام مثلا

و خوب خیلی به نظرم جالب نیست

[/right]

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

الزاما چیز بدی نیست تعریف یه پروپرتی جدید برای کلاس active record. بعضا پیش میاد که بعضی خصایص لازم نیست در طراحی دیتابیس و ساختار جدول ها دیده شند ولی از نظر منطقی در زمان اجرا حضور دارند، و همونطور که میدونیم ActiveRecord ها فقط فیلدهای دیتابیس رو به عنوان پروپرتی های کلاس در اختیار ما میگذارند، فکر کنم یکی از بهترین روش ها برای حل این جور مسایل، تعریف این ویژگی ها در کلاس مربوط به اون هست

تو خود دموی بلاگ هم برای برخی از کلاس ها پروپرتی های جدید تعریف شده، برای همین فکر میکنم این کار نه با قواعد OOP تعارضی داشته باشه و نه با استانداردهای Yii

اما اگر دیگر دوستان راه بهتر و استاندارد تری سراغ دارند، منم خوشحال میشم یاد بگیرم :)

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

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

یک راه دیگه هم استفاده از setter/getter ها هست که در Yii به خوبی پیاده سازی شده اند، با این کار دیگه نیازی به تعریف مستقیم پروپرتی جدید هم نیست

من برای همون مورد image که گفتید یک کد به عنوان نمونه قرار میدم:

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




in your Class:

class YourClass extends CActiveRecord

{

	..

	.. 


	public function getImage()

	{

		return CHtml::image('path/to/image', 'alt', array("width" => "70", "height" => "90"));

	}


	..

	..

}




in view:


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

                array(

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

                        'filter'=>$model,

                        'columns' => array(

                                  'title',

                                  'description',  

                                  ..

                                  array(

                                        'name' => 'image',

                                        'type' => 'raw',

                                        'filter' => false,

                                        ),  

                                  ..

                        )

                ); 



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

این روش با اصول MVC هم قرابت بیشتری داره و منطق پیدا کردن و ایجاد عکس رو از view به model منتقل میکنه

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

[rtl]

برای اینکه attribute ایجاد نکنی میتونی تو تعریف ستون gridview به جای name از header استفاده کنی

[/rtl]




'header' => 'image',