kopecsrk
(Dzumir)
February 20, 2013, 1:42pm
1
Witam, zaczynam zabawę z YII FRAMEWORK.
Stworzyłem model ‘Task’ który posiada controller oraz widok _view.php.
Nie mogę doszukać się w internecie w jaki sposób przesłać zmienne z modelu Task.php do widoku _view.php.
w Task.php stworzyłem akcje która łączy mi dwie tablice:
public function getProjectTasks() {
$select = Yii::app()->db->createCommand()
->select(array('task.*', 'u.name as user_name', 'a.name as author_name'))
->from('task')
->join('user u', 'u.id=task.user_id')
->join('user a', 'a.id=task.author_id');
return $select->queryAll();
W TaskController.php dodałem :
public function actionIndex() {
$model = new Task();
$this->result = $model->getProjectTasks();
$dataProvider = new CActiveDataProvider('Task');
$this->render('index', array(
'dataProvider' => $dataProvider,
'result' =>$this->result,
));
Oraz w widoku _view.php :
foreach ($this->result as $key => $value) {
print_r($value) . '<br/>';
};
?>
Po czym wyskakuje mi błąd:
Trying to get property of non-object
C:\xampp\htdocs\yii_learn\protected\views\task\_view.php(46)
34 <br />
35
36 <b><?php echo CHtml::encode($data->getAttributeLabel('author_id')); ?>:</b>
37 <?php echo CHtml::encode($data->author_id); ?>
38 <br />
39
40 <b><?php echo CHtml::encode($data->getAttributeLabel('user_id')); ?>:</b>
41 <?php echo CHtml::encode($data->deadline); ?>
42 <br />
43
44
45 <b><?php echo CHtml::encode($data->getAttributeLabel('project_id')); ?>:</b>
46 <?php echo CHtml::encode($value->user_id); ?>
47 <br />
48
49
50
51 </div>
Co zrobiłem źle? w jaki sposób przesłać zmienne do widoku?
baranek
(Thebillek)
February 20, 2013, 1:46pm
2
$this->render('index', array(
'dataProvider' => $dataProvider,
'result' =>$this->result,
));
wyswietlasz w _view.php a przekazyjesz do index. Sprawdz index.php, powinienes miec cos takiego
$this->renderPartial('_view',array(
'dataProvider' => $dataProvider,
'result' =>$result,
)));
kopecsrk
(Dzumir)
February 20, 2013, 2:03pm
3
Baranek:
$this->render('index', array(
'dataProvider' => $dataProvider,
'result' =>$this->result,
));
wyswietlasz w _view.php a przekazyjesz do index. Sprawdz index.php, powinienes miec cos takiego
$this->renderPartial('_view',array(
'dataProvider' => $dataProvider,
'result' =>$result,
)));
index.php od modelu Task wygląda tak:
<?php
/* @var $this TaskController */
/* @var $dataProvider CActiveDataProvider */
$this->breadcrumbs=array(
'Tasks',
);
$this->menu=array(
array('label'=>'Create Task', 'url'=>array('create')),
array('label'=>'Manage Task', 'url'=>array('admin')),
);
?>
<h1>Tasks</h1>
<?php $this->widget('zii.widgets.CListView', array(
'dataProvider'=>$dataProvider,
'itemView'=>'_view',
)); ?>
viktor
(Grzegorz Wiktorowski)
February 20, 2013, 2:13pm
4
W _view.php zmienne są dostępne jako $data->nazwaPolaZmodelu.
np: model na pole rok i miesiac, to w widoku generowanym przez CListView odwołujesz się jako $data->rok i $data->miesiac, jeżeli chcesz przesłać inne zmienne to musisz skonfigurowąć widżet i dodać linię
'viewData'=>array('zmienna'=>zmienna z kontrolera)
viktor
(Grzegorz Wiktorowski)
February 20, 2013, 2:22pm
5
Masz cały przykład
1.kontroler
public function actionTwojeZadania($kategoria = null)
{
if ($kategoria == null) throw new Exception('Brak parametru kategoria');
$model = new JobListaSzablon();
$model->kategoria = $kategoria;
$this->render('twojeZadania', array(
'dataProvider' => $model->search(),
'kategorie' => $model->getKategorie(),
'rodzaje' => $model->getRodzaje(),
'koszyki' => $model->getKoszyki(),
));
}
widok
<?php
$this->widget('zii.widgets.CListView', array(
'dataProvider' => $dataProvider,
'viewData' => array( 'kategorie' => $kategorie, 'rodzaje'=>$rodzaje, 'koszyki'=>$koszyki),
'ajaxUpdate' => false,
'template' => '{sorter}{pager}{summary}{items}{pager}',
'itemView' => '_twojeZadania',
/*
'pager' => array(
'maxButtonCount' => '7',
),
'sortableAttributes' => array(
'data',
'nazwa',
),
*/
));
?>
3.‘itemView’=>’_twojeZadania’
[html]<div class="_akcje clearfix">
<table>
<tr>
<td>Kategoria : </td>
<td><?php echo $kategorie[$data->kategoria]; ?></td>
<td>
<?php
echo CHtml::link('', array('/job/szablon/edytujZadanie', 'id' => $data->id),
array('class' => 'edytuj ikonka')
);
echo CHtml::link('', array('/job/szablon/statusZadania', 'id' => $data->id),
array('class' => ($data->status) ? 'status_tak ikonka' : 'status_nie ikonka')
);
echo CHtml::link('', array('/job/szablon/skasujZadanie', 'id' => $data->id),
array('class' => 'skasuj ikonka', 'onClick' => new CJavaScriptExpression('return confirm("Czy na pewno skasować ?")'))
);
?>
</td>
</tr>
<tr>
<td>Rodzaj : </td>
<td><?php echo $rodzaje[$data->rodzaj]; ?></td>
</tr>
<tr>
<td>Waga : </td>
<td> <?php echo $data->waga; ?>%</td>
</tr>
<tr>
<td>Sposób rozliczenia : </td>
<td> <?php echo $koszyki[$data->id_koszyk]; ?></td>
</tr>
<tr>
<td>Status : </td>
<td> <?php echo ($data->status) ? 'Dopisane' : 'Nie dopisane'; ?></td>
</tr>
<tr>
<td>Zadanie : </td>
<td><?php echo $data->zadanie; ?></td>
</tr>
</table>
</div>[/html]
kopecsrk
(Dzumir)
February 20, 2013, 2:24pm
6
W _view.php zmienne są dostępne jako $data->nazwaPolaZmodelu.
np: model na pole rok i miesiac, to w widoku generowanym przez CListView odwołujesz się jako $data->rok i $data->miesiac, jeżeli chcesz przesłać inne zmienne to musisz skonfigurowąć widżet i dodać linię
'viewData'=>array('zmienna'=>zmienna z kontrolera)
Czyli muszę się odnieść do funcji w ClistView ? :
public function renderItems()
{
echo CHtml::openTag($this->itemsTagName,array('class'=>$this->itemsCssClass))."\n";
$data=$this->dataProvider->getData();
if(($n=count($data))>0)
{
$owner=$this->getOwner();
$viewFile=$owner->getViewFile($this->itemView);
$j=0;
foreach($data as $i=>$item)
{
$data=$this->viewData;
$data['index']=$i;
$data['data']=$item;
$data['widget']=$this;
$owner->renderFile($viewFile,$data);
if($j++ < $n-1)
echo $this->separator;
}
}
else
$this->renderEmptyText();
echo CHtml::closeTag($this->itemsTagName);
}
Zamiast print_r() warto wykorzystać:
CVarDumper::dump($value, 10, true)
http://www.yiiframework.com/doc/api/1.1/CVarDumper
kopecsrk
(Dzumir)
February 26, 2013, 9:40am
10
Dzieki .viktor.
Udało się w następujący sposób:
w modelu Task.php dodałem funkcję wyszukiwania:
public function searchWithUser() {
// Warning: Please modify the following code to remove attributes that
// should not be searched.
$criteria = new CDbCriteria;
$criteria->with = 'user'; //dla jednej tabeli
$criteria->with = array('user', 'author', 'project'); //dla kilku tabel
$criteria->compare('id', $this->id);
$criteria->compare('content', $this->content, true);
$criteria->compare('deadline', $this->deadline, true);
$criteria->compare('created', $this->created, true);
$criteria->compare('finished', $this->finished, true);
$criteria->compare('author_id', $this->author_id);
$criteria->compare('user_id', $this->user_id);
$criteria->compare('project_id', $this->project_id);
return new CActiveDataProvider($this, array(
'criteria' => $criteria,
));
}
W taskController.php przekazałem zmienną do widoku:
public function actionIndex() {
$model = new Task();
$dataProvider = new CActiveDataProvider('Task');
$this->render('index', array(
'dataProvider' => $model->searchWithUser(),
I w widoku:
<?php echo $data->user->name; ?>
Jeszcze raz wielkie dzięki.