tutorial - problema de php yii framework con objetos(2)
yii2 basic (2)
Escribe tu código como beow: -
// CGridView column definition:
''columns''=>array(
array(
''name''=>''naziv'',
''value''=>''$data->studijskiProgram->naziv'',
''type''=>''text'',
),
// Preparing the DataProvider in the model:
return new CActiveDataProvider(get_class($this),array(
''sort''=>array(
''multiSort''=>false,
''attributes''=>array(
''naziv''=>array(
''desc''=>''naziv desc'',
),
Esto es algo así como la continuación de la pregunta que ya publiqué " php yii framework issue with objects ", pero surgió un nuevo problema, así que estoy publicando una nueva pregunta para una mejor visualización del código y una explicación de lo que está mal. Esta es la parte problemática del código:
<?php $this->widget(''zii.widgets.grid.CGridView'', array(
''id''=>''predmet-grid'',
''dataProvider''=>$model->search(),
''filter''=>$model,
''columns''=>array(
//array(
// ''name''=>''naziv'',
// ''value''=>$model->studijskiProgram->naziv,
//),
''sp_id'',
''naziv'',
''semestar'',
''predavanja'',
''vjezbe'',
//array(
// ''class''=>''CButtonColumn'',
//),
),
)); ?>
Y este es el código de la clase modelo donde se ubican las relaciones:
<?php
/**
* This is the model class for table "predmet".
*
* The followings are the available columns in table ''predmet'':
* @property integer $id
* @property integer $sp_id
* @property string $naziv
* @property integer $semestar
* @property integer $predavanja
* @property integer $vjezbe
*/
class Predmet extends CActiveRecord
{
/**
* Returns the static model of the specified AR class.
* @param string $className active record class name.
* @return Predmet the static model class
*/
const STATUS_O = "O";
const STATUS_I = "I";
const STATUS_VP = "VP";
public static function model($className=__CLASS__)
{
return parent::model($className);
}
/**
* @return string the associated database table name
*/
public function tableName()
{
return ''predmet'';
}
/**
* @return array validation rules for model attributes.
*/
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array(''sp_id, naziv, semestar, predavanja, vjezbe, status'', ''required''),
array(''sp_id, semestar, predavanja, vjezbe'', ''numerical'', ''integerOnly''=>true),
array(''naziv'', ''length'', ''max''=>100),
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array(''id, sp_id, naziv, semestar, predavanja, vjezbe, status'', ''safe'', ''on''=>''search''),
);
}
/**
* @return array relational rules.
*/
public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
//POVEZUJEMO PREDMET I STUDIJSKI PROGRAM
//BELONGS_TO ide za vezu jedan u vise(kad na stranu 1 pisemo kome pripada)
//HASMANY ili HAS_MANY (?) JE ZA VISE U JEDAN
/*ovo prvo ''studijskiProgram'' je kao pokazivac na studijski program s kojim je povezan
Neka imamo $predmet. da bi pristupili nazivu studijskog programa kome pripada, koristicemo:
$predmet->studijskiProgram->naziv
*/
return array(
''studijskiProgram'' => array(self::BELONGS_TO, ''StudijskiProgram'', ''sp_id'')
);
}
/**
* @return array customized attribute labels (name=>label)
*/
public function attributeLabels()
{
return array(
''id'' => ''ID'',
''sp_id'' => ''Studijski program'',
''naziv'' => ''Naziv'',
''semestar'' => ''Semestar'',
''predavanja'' => ''Predavanja'',
''vjezbe'' => ''Vjezbe'',
''status'' => ''Status''
);
}
/**
* Retrieves a list of models based on the current search/filter conditions.
* @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
*/
public function search()
{
// Warning: Please modify the following code to remove attributes that
// should not be searched.
$criteria=new CDbCriteria;
$criteria->compare(''id'',$this->id);
$criteria->compare(''sp_id'',$this->sp_id);
$criteria->compare(''naziv'',$this->naziv,true);
$criteria->compare(''semestar'',$this->semestar);
$criteria->compare(''predavanja'',$this->predavanja);
$criteria->compare(''vjezbe'',$this->vjezbe);
return new CActiveDataProvider($this, array(
''criteria''=>$criteria,
));
}
//Funkcija za punjenje Combo box-a (Wombo)
public function uzmiStatusPredmeta()
{
return array(
self::STATUS_O => ''Obavezni'',
self::STATUS_I => ''Izborni'',
self::STATUS_VP => ''VP''
);
}
public function uzmiSpisakStudijskihPrograma()
{
$query = ''select id, naziv from studijski_program'';
$rezultat = Yii::app()->db->createCommand($query)->queryAll();
$spisak = CHtml::listData($rezultat,''id'',''naziv''); //prikazuje naziv, krije ID(valjda radi combo boxa-wombo ?)
return $spisak;
}
public function vratiProgram()
{
$query = ''select s.naziv
from studijski_program s,predmet p
where p.sp_id = s.id'';
$rezultat = Yii::app()->db->createCommand($query)->queryScalar();
//$rezultat1 = implode($rezultat);
//$rezultat2 = implode($rezultat1);
return $rezultat;
}
public function vratiProgramId()
{
$query = ''select s.id
from studijski_program s,predmet p
where p.sp_id = s.id'';
$rezultat = Yii::app()->db->createCommand($query)->queryScalar();
//$rezultat1 = implode($rezultat);
//$rezultat2 = implode($rezultat1);
return $rezultat;
}
}
Como puede ver aquí, existe una relación con "studijskiProgram" aquí utilizando la clave foránea "sp_id" en "predmet". Sin embargo, cuando estoy tratando de acceder a "naziv" proprety de "studijskiProgram" en la parte superior del código de esta manera:
array(
''name''=>''naziv'',
''value''=>$model->studijskiProgram->naziv,
),
que fue la solución con la pregunta anterior donde se usa el widget CDeatilView. Por alguna razón, lo mismo aquí no funciona e informa el error de tratar de obtener una propiedad de un objeto no. ¿Alguna idea de qué alterar para que funcione?
Yii Gridview toma el proveedor de datos y genera las filas. Puedes probar este.
Por favor, mira aquí más detalles. http://www.yiiframework.com/doc/api/1.1/CGridView
array(
''name'' => ''naziv'',
''value'' => ''(isset($data->studijskiProgram->naziv))?$data->studijskiProgram->naziv:""''
),