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