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.