2013-12-09 4 views
0

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/뷰/레이아웃/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이 그렇게하지 않는 것 같습니다.

누군가 아이디어가 있다면 아주 좋을 것입니다. 고맙습니다.

+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

안녕하세요, 솔루션 주셔서 감사합니다. 이제 main.php에서 $ this-> dataProvider2와 함께 작동합니다. 그러나 User Profil을 클릭하면 dataProvider2가 비어 있다고 알려줍니다. 또한 UserProroller에 dataProvider2를 추가해야했습니다. 그래서 그 컨트롤러는 모두 같은 변수를 사용하지만 다른 용도로 사용하는 것처럼 보입니다. 나는 진짜로 그것을 얻지 않는다. – K213

+0

그것은 문맥의 문제입니다. 레이아웃에있을 때 $ this는 레이아웃을 호출하는 컨트롤러를 나타냅니다. 따라서 $ this-> dataProvider2가 해당 컨트롤러에 정의되어 있지 않으면 레이아웃에서 액세스 할 수 없습니다. –

+0

도메인 컨트롤러 (DomainController.dataProvider2)와 같은 것을 할 수 있습니다. 그래야 항상 올바른 컨트롤러를 사용할 수 있습니까? – K213