Yii Przesyłanie Zmiennych Do Widoku

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?




 $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',

)); ?>



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)

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(),

        ));

    }

  1. 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">

&lt;table&gt;


    &lt;tr&gt;


        &lt;td&gt;Kategoria : &lt;/td&gt;


        &lt;td&gt;&lt;?php echo &#036;kategorie[&#036;data-&gt;kategoria]; ?&gt;&lt;/td&gt;


        &lt;td&gt;


            &lt;?php


            echo CHtml::link('', array('/job/szablon/edytujZadanie', 'id' =&gt; &#036;data-&gt;id),


                array('class' =&gt; 'edytuj ikonka')


            );





            echo CHtml::link('', array('/job/szablon/statusZadania', 'id' =&gt; &#036;data-&gt;id),


                array('class' =&gt; (&#036;data-&gt;status) ? 'status_tak ikonka' : 'status_nie ikonka')


            );





            echo CHtml::link('', array('/job/szablon/skasujZadanie', 'id' =&gt; &#036;data-&gt;id),


                array('class' =&gt; 'skasuj ikonka', 'onClick' =&gt; new CJavaScriptExpression('return confirm(&quot;Czy na pewno skasować ?&quot;)'))


            );


            ?&gt;


        &lt;/td&gt;


    &lt;/tr&gt;





    &lt;tr&gt;


        &lt;td&gt;Rodzaj : &lt;/td&gt;


        &lt;td&gt;&lt;?php echo &#036;rodzaje[&#036;data-&gt;rodzaj]; ?&gt;&lt;/td&gt;





    &lt;/tr&gt;





    &lt;tr&gt;


        &lt;td&gt;Waga : &lt;/td&gt;


        &lt;td&gt; &lt;?php echo &#036;data-&gt;waga; ?&gt;%&lt;/td&gt;





    &lt;/tr&gt;





    &lt;tr&gt;


        &lt;td&gt;Sposób rozliczenia : &lt;/td&gt;


        &lt;td&gt; &lt;?php echo &#036;koszyki[&#036;data-&gt;id_koszyk]; ?&gt;&lt;/td&gt;





    &lt;/tr&gt;





    &lt;tr&gt;


        &lt;td&gt;Status : &lt;/td&gt;


        &lt;td&gt; &lt;?php echo (&#036;data-&gt;status) ? 'Dopisane' : 'Nie dopisane'; ?&gt;&lt;/td&gt;





    &lt;/tr&gt;





    &lt;tr&gt;


        &lt;td&gt;Zadanie : &lt;/td&gt;


        &lt;td&gt;&lt;?php echo &#036;data-&gt;zadanie; ?&gt;&lt;/td&gt;


    &lt;/tr&gt;


&lt;/table&gt;

</div>[/html]

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);

	}

Masz wyżej cały przykład

powinno pomoc

Zamiast print_r() warto wykorzystać:


CVarDumper::dump($value, 10, true)

http://www.yiiframework.com/doc/api/1.1/CVarDumper

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.