Yii dataProvider тема main.php

В моем SiteController.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
    ));
}

В моих темах /k/views/layout/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" не определено.

Так что в моем пользователе _view.php Yii, кажется, берет поставщика данных домена.

Как мне вставить эти dataProviders в мой файл main.php макета? SiteController.php, похоже, не делает это правильно.

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

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 теперь доступен в вашем файле просмотра, но не забывайте проверять, существует ли он перед его использованием.

Другой метод состоит в том, чтобы использовать магический метод получения из Yii.

В вашей модели опишите такой метод;

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

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

private $_dataProvider2;
Другие вопросы по тегам