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;