OnlyPHP

Yii CTreeView用法举例

-- 表的结构 `coverage`
--
CREATE TABLE IF NOT EXISTS `coverage` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`pid` int(10) unsigned DEFAULT NULL,
`coverageName` varchar(100) DEFAULT NULL,
`coverageDesc` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `pid` (`pid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=20 ;
--
-- 转存表中的数据 `coverage`
--
INSERT INTO `coverage` (`id`, `pid`, `coverageName`, `coverageDesc`) VALUES
(16, NULL, '类别', ''),
(17, 16, '类别一', ''),
(18, NULL, '分类', ''),
(19, 17, '类别二', '');
--
-- 限制表 `coverage`
--
ALTER TABLE `coverage`
ADD CONSTRAINT `coverage_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `coverage` (`id`) ON DELETE CASCADE;

 

方法一,直接写死在view文件里

<?php
$this->widget('system.web.widgets.CTreeView', array(
    'animated' => 'normal',
    'data' => array(
        array(
            'text' => '<span>AAAA</span>',
            'children' => array(array(
                    'text' => '<a href="' . $this->createUrl('/site/index') . '">BBBB</a>',
                    'text' => '<a href="' . $this->createUrl('/site/page') . '">BBB</a>',
                    ), ),
            ),
        array(
            'expanded' => false,
            'text' => '<span>CCCC</span>',
            'children' => array(
                array('text' => 'CCC'),
                array('text' => 'CCC', ),
                ),
            ),
        ),
    ));
?>

优点:简单明了,缺点:新增或修改需要修改文件

方法2:ajax动态加载

在view中写入

<?php
$this->widget('CTreeView', array(
    'persist' => 'cookie',
    'animated' => 'fast',
    'url' => array('ajaxFillTree'),
    'htmlOptions' => array('id' => 'coverageTree', 'class' => 'coverageTree')));
?>

在Controller.php中写入

public function actionAjaxFillTree()
{
if(!Yii::app()->request->isAjaxRequest)
{
exit();
}
$parentId=null;
if(isset($_GET['root']) and $_GET['root'] != 'source')
{
$parentId=(int) $_GET['root'];
}
$req=Yii::app()->db->createCommand(
"SELECT m1.id, m1.name AS text, m2.id IS NOT NULL AS hasChildren "
."FROM coverage AS m1 LEFT JOIN coverage AS m2 ON m1.id=m2.pid "
."WHERE m1.pid <=> $parentId "
."GROUP BY m1.id ORDER BY m1.name ASC"
);
//<=>叫做安全等于,至于什么情况下使用<=>有知道的告诉哈
$children=$req->queryAll();

echo str_replace('"hasChildren":"0"', '"hasChildren":false', CTreeView::saveDataAsJson($children)
        );

//AAA:如果要在节点处增加链接,在$children=$req->queryAll()后面增加下面的
 $treedata=array();
foreach ($children as $child)
{
$options=array('href'=>'#','id'=>$child['id'],'class'=>'treenode');

               /*BBB:如果是只在叶子节点上增加链接
$child['text'] = ($child['hasChildren'] == true ? $child['text'] : CHtml::openTag('a', $options).$child['text'].CHtml::closeTag('a')."\n");

             *--BBB

              */

             /*CCC:如果父节点也要链接

            $nodeText = CHtml::openTag('a', $options);
                   $nodeText .= $child['text'];
                   $nodeText .= CHtml::closeTag('a') . "\n";
                    $child['text'] = $nodeText;

           *--CCC

            */
$treedata[]=$child;
}

 

//AAA:修改echo部分
echo str_replace(
'"hasChildren":"0"','"hasChildren":false',CTreeView::saveDataAsJson($treedata)
);


exit();
}

至于要链接的动作可新建表记录相应节点对应的动作;

扩展:可加入权限控制,只显示用户用户有权限的节点。

posted on 2013-05-02 16:09  OnlyPHP  阅读(373)  评论(0编辑  收藏  举报

导航