新手求助 - rend侧边栏

大家好,我接触Yii不久,不是很清楚如何做到rend侧边栏。

侧边栏的内容有需要从数据库读取的,现在controller里能提供dataprovider得到。

controllers/UserController.php:


$feedDataProvider=new CActiveDataProvider('Feeds', array(

    'criteria'=>array(

        'condition'=>"UID=$id",

        'order'=>'FEED_TIME DESC',

    ),

    'pagination'=>array(

        'pageSize'=>10,

    ),

));

$feedUser = $feedDataProvider->getData();

$this->render('index',array(

    'dataProvider'=>$dataProvider,

    'feedUser'=>$feedUser,

));

在view中把数据存到sidebar变量中,这是我在components/Controller.php中加的一个私有变量(参照Yii menu的做法):

views/user/index.php


$feed = array();

for ($i = 0; $i < count($feedUser); ++$i){

    $feed[$i] = User::model()->findByPk($feedUser[$i]->UID)->EMAIL;

}

$this->sidebar=array(

    'feedAmt'=>count($fedUser),

);



布局比较复杂,不能通过简单的Yii widget实现,在layout中读取$feed变量:


<div id="sidebar">

...<?php echo $this->sidebar['feed'][0];?>

...

</div>

这样访问index.php/user能有预期的侧边栏效果,但是index.php/user/1报错

找不到$this->sidebar[‘feed’][0]变量

所以我是不是一开始的方向就错了?是不是应该用rendPartial?但是这个好像就没法跟布局关联起来了,我希望得到一个数组,并在侧边栏布局的不同地方显示。应该如何做到呢?

麻烦附上具体的demo代码,谢谢!

用 widget 试试。

由于不是在IDE中做 所以代码不一定正确 自己修改:




  //先定义一个widget类:

  

   class SideNav extends CWidget{

   

    //widget 声明的公共变量 就是其同外部的接口 需要什么就声明什么 外部在初始化时传入即可

    public $userId ; 

  

    public function run(){


     $feedDataProvider=new CActiveDataProvider('Feeds', array(

    'criteria'=>array(

        'condition'=>"UID=:uid",

        'params' => array(

                     ':uid'=>$this->userId;

                   );

        'order'=>'FEED_TIME DESC',

    ),

    'pagination'=>array(

        'pageSize'=>10,

    ),

));

$feedUser = $feedDataProvider->getData();

$this->render('leftSideBar',array(

    'dataProvider'=>$dataProvider,

    'feedUser'=>$feedUser,

));





     }





  }




/* 在跟该widget 同目录的views文件下建立视图 leftSideBar (如果没有自己建立一个文件夹  关于widget请参考blog示例应用):

在其中渲染 数据  , 一般用数组出现错误就是你瞎搞 胡乱应用索引和键值 在你不清楚数据的结构时先用print_r($arr) 或者var_dump() 打印出数据的内部结构 这是基本功 要学会使用print_r  var_dump  然后在根据数据结构确定如何使用 */


//视图中引入你的widget:


  <?php  $this->widget('xxx.xxx.SideNav',array(


                'userId'=>Yii::app()->user->getId();  /*注意这里只是专递了当前用户的id号 如果你在渲染左侧导航过程中还需要传递其他 变化的参数 同样仿此即可 另外注意非空判断 是否访客等条件....*/

         ));