This article will show you how to add links and class to each node in ctreeview. so you can attach events in js by obtaining handler on anchor or class.
I am new to Yii, and I love this framewrok. lately I have been playing a bit with ctreeview. and I find out there is a lack of documentation about adding links to ctree node, so here, I would like to share my experience with you, because I think this is a quite common practice if you are using ctreeview. this article is based on this article
中文版请查看这里
So I assume that you have something like this in your controller:
public function actionAjaxFillTree() { if (!Yii::app()->request->isAjaxRequest) { exit(); } $parentId = "NULL"; if (isset($_GET['root']) && $_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 tree AS m1 LEFT JOIN tree AS m2 ON m1.id=m2.parent_id " . "WHERE m1.parent_id <=> $parentId " . "GROUP BY m1.id ORDER BY m1.name ASC" ); $children = $req->queryAll(); echo str_replace( '"hasChildren":"0"', '"hasChildren":false', CTreeView::saveDataAsJson($children) ); exit(); }
after the query($children = $req->queryAll()) in the above code, add the following loop to insert a link to each node, you can also add a class or id along with it.
$treedata=array(); foreach($children as $child){ $options=array('href'=>'#','id'=>$child['id'],'class'=>'treenode'); $nodeText = CHtml::openTag('a', $options); $nodeText.= $child['text']; $nodeText.= CHtml::closeTag('a')."\n"; $child['text'] = $nodeText; $treedata[]=$child; }
And replace
CTreeView::saveDataAsJson($children)
with
CTreeView::saveDataAsJson($treedata)
So try it out now.
Total 2 comments
if you would like to have URLs only on childs use this @ foreach loop :
There is already an extension that can handle such task. You can view it here.
Leave a comment
Please login to leave your comment.