Belongs_to Relation = NULL mit php >v.5.3.1 property of non object exception

Hallo liebe Yii-Gemeinde,

seit ich heute die von mir programmierte Anwendung auf ein Produktionssystem übertragen wollte, bereitet mir die BELONGS_TO Relation Probleme und ich finde kein passendes Workaround.

Der elementare unterschied zwischen meiner lokalen Entwicklungsumgebung und dem Produktionssystem ist die PHP Version.

Entwickelt habe ich unter PHP 5.3.1. Hier läuft alles wie es soll einschliesslich aller Relationen.

Auf dem Produktionssystem läuft (leider) die PHP v.5.3.3

Die BELONGS_TO Relation bereitet mir nun immer Schwierigkeiten, wenn der betreffende Fremdschlüssel= NULL ist.

Unter PHP 5.3.1 wurde hier einfach nichts angezeigt. In der CGridView Darstellung blieb das Tabellenfeld einfach leer.

Nun erhalte ich eine Property of Non-Object exception. Beispiel:

Ein Gerät kann einen Verkäufer haben. In dem Fall soll der Name des Verkäufers angezeigt werden. Es muss aber noch nicht verkauft worden sein. In dem Fall soll einfach nichts angezeigt werden. Gleiches gilt für den Besitzer. In diesem Fall wären dann FK_VERKAUFER = NULL und/oder FK_BESITZER=NULL.




	public function relations()

	{

		return array(

                    'REL_BESITZER'=>array(self::BELONGS_TO, 'Kunde', 'FK_BESITZER'),

                    'REL_VERKAEUFER'=>array(self::BELONGS_TO, 'Haendler', 'FK_VERKAEUFER'),


		);

	}



So sieht die admin.php aus. Ich nutze hier das von gii generierte CGridView mit anpassungen um die Eigenschaften der Relationen anzuzeigen.




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

	'id'=>'hardwareeinheit-grid',

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

	'filter'=>$model,

	'columns'=>array(

		#'PK_ID',

		#'FK_VERKAEUFER',

		'GERAETENAME',

		'SERIALNO',

		'IP_ADDR',

		'MAC_ADDR',

		#'HERSTELLER',

		#'FK_BESITZER',

                array(

                  'name'=>'FK_BESITZER',

                  'value'=>'$data->REL_BESITZER->KUNDENNAME',

                  'header'=>'Besitzer'

                ),


                 array(

                  'name'=>'FK_VERKAEUFER',

                  'value'=>'$data->REL_VERKAEUFER->HAENDLERNAME',

                  'header'=>'Verkäufer'

                ),  

		array(

                    'class'=>'CButtonColumn',

                        'header'=>CHtml::dropDownList(

                                'pageSize',

                                $pageSize,

                                array(5=>5,20=>20,50=>50,100=>100),

                                    array('class'=>'change-pagesize')


                        ),

		),

	),

)); ?>



Search:




		$criteria=new CDbCriteria;


                $criteria->with =array('REL_BESITZER','REL_VERKAEUFER');

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

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

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

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

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

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

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

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

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



Diese Adminpage wird unter 5.3.3 immer dann sauber angezeigt, wenn jede "Hardwareeinheit" einen Verkäufer und einen Besitzer hat. Dies ist aber nicht immer der Fall.

Ich habe es schon mit einer Funktion versucht, die prüft ob es das Relationen-Array gibt:

Model/Hardwareeinheit.php




        public function getVerkaeufer(){

            if (!empty($this->REL_VERKAEUFER)){

                return $this->REL_VERKAEUFER->HAENDLERNAME;

            }

        }



in der admin.php steht dann:




[...]

                 array(

                  'name'=>'FK_VERKAEUFER',

                  'value'=>$model->getVerkaeufer,

                  'header'=>'Verkäufer'

                ),  

[...]



Leider ignoriert Yii diese Funktion und schreibt selbstständig die ID des Verkäufers statt den Namen in das Feld :(

Die Idee die Geräte einem "Dummy-Verkäufer" ist nicht praktikabel, da ich dieses Relationen-Problem auch in anderen Tabellen habe.

Ich hoffe einer von euch erfahrenen "Yii-Hasen" hatte auch schonmal dieses Problem und kann mir bei der Lösung helfen.

Danke

Tobias

Versuch mal das volgende:




array(

  'value'=>'$data->REL_BESITZER ? $data->REL_BESITZER->KUNDENNAME : ""',

  'header'=>'Besitzer'

),

array(

  'value'=>'$data->REL_VERKAEUFER ? $data->REL_VERKAEUFER->HAENDLERNAME ? ""',

  'header'=>'Verkäufer'

),  



Die ‘name’ soll mann nicht Benuetzen fuer solche Relationen, weil Yii dass dann nicht gut versteht. Einfach ‘value’ und ‘header’ reicht.

So mach ich das selbst auch immer.

http://www.mrsoundless.com/post/2011/05/09/Searching-and-sorting-a-column-from-a-related-table-in-a-CGridView.aspx

hast du das schon ausgeschekct so mach ich das und es funktioniert einwandfrei.