2013-12-09 66 views
0

在我SiteController.phpYii的數據提供程序的主題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 
    )); 
} 

在我的主題/ K /視圖/佈局/ 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似乎採取域數據提供者。

如何將這些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 
    )); 
} 

} 

$這個 - > dataProvider是現在在你的視圖文件可用,但不foorget檢查它使用它之前存在。

另一種方法是使用來自Yii的魔法吸氣劑方法。

在你的模型中,描述一個像這樣的方法;

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

你需要一個屬性;的

private $_dataProvider2; 
+0

嗨,感謝您的解決方案。現在它可以在main.php中使用$ this-> dataProvider2。但是如果我點擊User Profil,它會告訴我dataProvider2是空的。我還必須將dataProvider2添加到我的UserController。所以看起來這些控制器都使用相同的變量但具有不同的用途。我真的不明白。 – K213

+0

這是一個背景問題。當你在佈局中時,$ this是指調用佈局的控制器。因此,如果$ this-> dataProvider2未在該控制器中定義,則佈局將無法訪問它。 –

+0

所以,我可以做一些像DomainController.dataProvider2這樣的東西,這樣它總是需要正確的控制器? – K213