если требуется работа с деревом, может проще использовать плагин для jquery?
http://www.jstree.com/demo
http://plugins.jquery.com/search/node/t ... ect?page=1
если не охота, я бы работал с подобным кодом :
некое дерево, часть которого генерится на сервере:
Код: Выделить всё
<!-- контейнер дерева -->
<div class="ajax_tree">
<!-- первый уровень дерева -->
<ul>
<li>
<!-- ссылка, которая может загрузить кусок дерева -->
<?php echo CHtml::link('test', $url); ?>
<!-- уже загруженный аяксом кусок-->
<ul>
<li>
<!-- ссылка, которая может загрузить дерево -->
<?php echo CHtml::link('test', $url); ?>
</li>
</ul>
</li>
</ul>
</div>
код js, который обрабатывает наше дерево
Код: Выделить всё
$(document).ready(function(){
// вешаем live событие на все ссылки в дереве, которые загружены и будут загружены
$('div.ajax_tree a').live('click', function(){
// делаем get запрос по кликнутой ссылке, сервер должен вернуть кусок html.
(function(element){
$.get(
//запрашиваем по адресу текущей ссылки
$(this).attr('href'),
//по загрузке
function(data){
//очищаем текущее дерево.
$(element).children('ul').remove();
//добавляем загруженный кусочек дерева.
$(element).append(data);
}
);
})(this);
return false;
});
});
в контроллере, ессно, должен быть определен action, который будет генерить кусок дерева, типа
Код: Выделить всё
public function actionAjaxTree(){
$item = $this->loadItem($_REQUEST['id']);
$items = $item->getChildrens(); // ищем поддерево
$this->renderTree($items); // отображаем элементы дерева
}
Разумеется, наши ссылки должны ссылаться на этот action