Yii dataProvider主题main.php

时间:2013-12-09 10:30:15

标签: php yii dataprovider yii-routing zii-widgets

在我的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',));
        ?>

到目前为止工作正常。但是,如果我去用户Profil:

/user/view/id/5

未定义属性“Domain.username”。

所以在我的用户_view.php中,Yii似乎采用了Domain Dataprovider。

如何将这些dataProviders传递给我的布局main.php文件? SiteController.php似乎没那么做。

如果有人在这里有想法,那将是非常好的。 谢谢你提前。

1 个答案:

答案 0 :(得分: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-&gt; dataProvider现在可以在您的视图文件中使用,但在使用之前不要检查它是否存在。

另一种方法是使用Yii的魔术getter方法。

在你的模型中,描述一个像这样的方法;

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

你需要一个房产;

private $_dataProvider2;