Yii Framework Forum: Yii Przesyłanie Zmiennych Do Widoku - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Yii Przesyłanie Zmiennych Do Widoku (Trying to get property of non-object) Rate Topic: -----

#1 User is offline   kopecldz 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 86
  • Joined: 20-February 13

Posted 20 February 2013 - 08:42 AM

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?
0

#2 User is offline   Baranek 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 38
  • Joined: 19-July 11

Posted 20 February 2013 - 08:46 AM

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

0

#3 User is offline   kopecldz 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 86
  • Joined: 20-February 13

Posted 20 February 2013 - 09:03 AM

View PostBaranek, on 20 February 2013 - 08:46 AM, said:

 $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',
)); ?>

0

#4 User is offline   .viktor. 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 90
  • Joined: 25-August 10
  • Location:Sokołów Podlaski, Poland

Posted 20 February 2013 - 09:13 AM

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)

0

#5 User is offline   .viktor. 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 90
  • Joined: 25-August 10
  • Location:Sokołów Podlaski, Poland

Posted 20 February 2013 - 09:22 AM

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


2. 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'
<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>

0

#6 User is offline   kopecldz 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 86
  • Joined: 20-February 13

Posted 20 February 2013 - 09:24 AM

View Post.viktor., on 20 February 2013 - 09:13 AM, said:

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

0

#7 User is offline   .viktor. 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 90
  • Joined: 25-August 10
  • Location:Sokołów Podlaski, Poland

Posted 20 February 2013 - 09:27 AM

View Postkopecldz, on 20 February 2013 - 09:24 AM, said:

Czyli muszę się odnieść do funcji w ClistView ? :



Masz wyżej cały przykład
0

#8 User is offline   mirunho 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 170
  • Joined: 19-December 12
  • Location:Gdansk, Poland

Posted 21 February 2013 - 09:47 AM

View Postkopecldz, on 20 February 2013 - 08:42 AM, said:


Oraz w widoku _view.php :
foreach ($result as $key => $value) { // zmienna przekazales do widoku jako result
    print_r($value) . '<br/>';

};
?>

Co zrobiłem źle? w jaki sposób przesłać zmienne do widoku?


powinno pomoc
0

#9 User is offline   aquasite.pl 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 18
  • Joined: 20-May 11

Posted 22 February 2013 - 03:14 PM

Zamiast print_r() warto wykorzystać:
CVarDumper::dump($value, 10, true)

http://www.yiiframew.../1.1/CVarDumper
Posted Image
Agencja interaktywna Itzen.pl
Informatyczne rozwiązania dla firm.
Programowanie, Pozycjonowanie, Testy A/B, Reklama.
0

#10 User is offline   kopecldz 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 86
  • Joined: 20-February 13

Posted 26 February 2013 - 04:40 AM

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.
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users