2013-12-09 6 views
0

В моей SiteController.phpYii DataProvider тема main.php

public function actionIndex() 
{ 
    // renders the view file 'protected/views/site/index.php' 
    // using the default layout 'protected/views/layouts/main.php' 
    //$this->render('index'); 

    $dataProviderUser=new CActiveDataProvider('User',array(
       'pagination'=>array(
        'pageSize'=>20, 
       ), 
      )); 
    $dataProviderDomain = new CActiveDataProvider('Domain'); 

    $this->render('index',array(
    'dataProvider1'=>$dataProviderUser, 
    'dataProvider2'=>$dataProviderDomain 
    )); 
} 

В моих темах/к/вид/макет/main.php

 <?php 
     if(!Yii::app()->user->isGuest) 
     { 
     $this->widget('zii.widgets.CListView', array(
      'dataProvider'=>$dataProvider2, 
      'itemView'=>'_view',)); 
     ?> 

Эта ошибка появляется: Неопределенная переменная: dataProvider2

Если я сделать это в моем main.php:

<?php 
     $dataProvider2 = new CActiveDataProvider('Domain'); 
     if(!Yii::app()->user->isGuest) 
     { 
     $this->widget('zii.widgets.CListView', array(
      'dataProvider'=>$dataProvider2, 
      'itemView'=>'_view',)); 
     ?> 

Это работает до сих пор. Но если я иду на пользователя Профиля:

/user/view/id/5 

недвижимости «Domain.username» не определен.

Так что в моем User _view.php Yii, кажется, принимает Dataprovider домена.

Как я могу пройти мимо этих dataProviders в мой макет main.php-файл? Возможно, SiteController.php делает это правильно.

Было бы очень приятно, если у кого-то есть идея здесь. Спасибо в продвинутом режиме.

+0

возможно дубликат [Как передать переменные в макете?] (Http://stackoverflow.com/questions/7058410/how-to-pass-variables-to-layout) – soju

+0

попытался это. Это не работает. – K213

ответ

1

Переменные, которые вы определили в действии вашего контроллера, доступны только для немедленного просмотра файлов, которые используются для визуализации представления. Они не доступны для макетов. Однако макеты смогут использовать общедоступные методы и свойства контроллера. Итак, если вы хотите передать переменную в свой макет, вам нужно объявить ее как свойство контроллера. Есть два способа сделать это.

Во-первых, вы можете просто создать общедоступную переменную.

Class YourController extends CController{ 

public $dataProvider2; 

public function actionIndex(){ 
// renders the view file 'protected/views/site/index.php' 
    // using the default layout 'protected/views/layouts/main.php' 
    //$this->render('index'); 

    $dataProviderUser=new CActiveDataProvider('User',array(
       'pagination'=>array(
        'pageSize'=>20, 
       ), 
      )); 
    $dataProviderDomain = new CActiveDataProvider('Domain'); 

//Added new line here 
$this->dataProvider2 = $dataProviderDomain; 
    $this->render('index',array(
    'dataProvider1'=>$dataProviderUser, 
    'dataProvider2'=>$dataProviderDomain 
    )); 
} 

} 

$ this-> DataProvider теперь доступен в файле вида, но не foorget, чтобы проверить, что оно существует, прежде чем использовать его.

Другой метод - использовать метод магического геттера от Yii.

В вашей модели описывайте метод, подобный этому;

public function getdataProvider2(){ 
return $this->_dataProvider2; 
} 

и вам понадобится недвижимость;

private $_dataProvider2; 
+0

Привет, спасибо за решение. Теперь он работает с $ this-> dataProvider2 в main.php. Но если я нажму «Профиль пользователя», он сообщает мне, что dataProvider2 пуст. Мне также пришлось добавить dataProvider2 в свой UserController. Таким образом, похоже, что эти контроллеры используют одну и ту же переменную, но с различным использованием. Я действительно не понимаю. – K213

+0

Это вопрос контекста. Когда вы находитесь в макете, $ это относится к контроллеру, который вызывает макет. Поэтому, если $ this-> dataProvider2 не определен в этом контроллере, тогда макет не сможет получить к нему доступ. –

+0

Могу ли я сделать что-то вроде DomainController.dataProvider2, так что он всегда принимает правильный контроллер? – K213