YiiWheels WhGridView

Witam,

Mam mały problem, stworzyłem sobie WhGridView


           $this->widget('yiiwheels.widgets.grid.WhGridView', array(

		'fixedHeader' => true,

		'headerOffset' => 40,

		'type' => 'striped bordered',

		'filter'=>$model,

		'id'=>'stan-grid',

		'ajaxUpdate'=>true,

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

		'responsiveTable' => true,

		'template' => "{items} {pager}",

		'columns'=>array(

			array(

				'name'=>'imie_nazwisko',

				'filter' => CHtml::activeDropDownList($model,'imie_nazwisko',$imie_nazwisko_list),

				'value' => $model->imie_nazwisko,

				),

			array(

				'name'=>'wartosc',

				'filter' => false,

				),

			array(

				'name'=>'[rodzaj].nazwa',

				'filter' => false,

				),

		),

	));

Który zaopatrza w dane ta oto funkcyjka:


public function search()

	{

		$criteria=new CDbCriteria;

		$rodzajeArray= array();

		$rodzaje = Rodzaj::model()->findAll();

		

		foreach($rodzaje as $rodzaj){

			$rodzajeArray[] = $rodzaj->nazwa;

		}

		

		$database = Yii::app()->db->createCommand('SELECT DB_NAME(DB_ID()) AS dbname')->query()->read();

		$criteria->alias = 'stan';

		$criteria->join='LEFT JOIN '.$database['dbname'].'.dbo.tbl_rodzaj as rodzaj ON [rodzaj].map2 =     

                    [stan].map2';

		

		$criteria->compare('[rodzaj].nazwa',$rodzajeArray,true);

		$criteria->compare('[rodzaj].map2',$this->map2,true);

		$criteria->compare('[stan].imie_nazwisko',$this->imie_nazwisko,true);

		$criteria->compare('[stan].wartosc',$this->wartosc,true);

		

		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

			'pagination'=>array(

				'pageSize' => 10,

			),

		));

	}

Problem polega na tym, że w kolumnie


                            array(

				'name'=>'[rodzaj].nazwa',

				'filter' => false,

				'value'=>$model->nazwa,

		             ),

Brak jakichkolwiek danych, ponadto filtrowanie w kolumnie


imie_nazwisko

też nie działa, nie mam pojęcia dlaczego. Ponadto prześledziłem zapytanie w SQLprofilerze i dane są ok. Liczę na pomoc.

Pozdrawiam.

Dla grida wartość musi być podana jako kod do wykonania (jako string, np ‘value’ => ‘$model->imie_nazwisko’) albo jako funkcja do wykonania zwracająca wartość.

Żeby filtrowanie działało po wirtualnym polu, które nie istnieje w modelu, musisz ręcznie dodać taki atrybut do głównego modelu, który wykorzystujesz w gridzie. Czyli w twoim modelu dodajesz:


public $imie_i_nazwisko;

I dodajesz dla niego regułę do walidacji.

Ok. problem teraz mam taki, który krzyczy, że nie wie co to $model w:


'value' => '$model->imie_nazwisko'

Jak to naprawić?

Zamień $model na $data. Warto też zajrzeć do dokumentacji: http://www.yiiframework.com/doc/api/1.1/CGridView

Dzięki, ogarnąłem temat z wstawianiem wartości. Jednak nadal nie mogę dociec dlaczego filtry nie działają:

Widok:




			'columns'=>array(

				array(

					'name'=>'kadryid',

					'filter' => CHtml::activeDropDownList($model,'kadryid',$kadryid_list),

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

					),

Walidacja:


$criteria->compare('[stan].kadryid',$this->kadryid,true);

Model:


public $kadryid;

Na pewno dodałeś dla tego atrybutu regułę walidacji dla odpowiedniego scenariusza (metoda rules() w modelu)? Coś w stylu:


array('kadryid', 'safe', 'on' => 'search'),

W gridzie jako ‘filter’ możesz ustawić tablicę możliwych wartości:


'filter' => $kadryid_list

Tak, walidacja wygląda dokładnie tak:


array('wartosc, map2, kadryid', 'safe', 'on'=>'search'),

Zmieniłem w gridzie ‘filter’ i nic się nie zmieniło.