Ок, сейчас гляну. Пока что решил так(гугль сила)
public function actionView($category)
{
$a = explode("/", $category);
$c = array_pop($a);
$category = Category::model()->find('alias=:alias', array(':alias'=>$c));
$data = Category::model()->findAll();
$ids = $this->fetch_recursive($this->buildtree($data), $category->id);
foreach ($ids as $key => $value) {
$id[] = $value['id'];
}
$criteria = new CDbCriteria();
$criteria->addInCondition('t.category_id', $id);
$dataProvider = new CActiveDataProvider(Node::model()->cache(3600), array(
'criteria'=>$criteria,
'pagination'=> array(
'pageSize'=> 10,
'pageVar'=>'page',
)
));
$this->render('index', array(
'dataProvider'=>$dataProvider,
'category'=>$category,
));
}
public function buildtree($src_arr, $parent_id = 0, $tree = array())
{
foreach($src_arr as $idx => $row)
{
if($row['parent_id'] == $parent_id)
{
foreach($row as $k => $v)
$tree[$row['id']][$k] = $v;
unset($src_arr[$idx]);
$tree[$row['id']]['children'] = $this->buildtree($src_arr, $row['id']);
}
}
ksort($tree);
return $tree;
}
public function fetch_recursive($tree, $parent_id, $parentfound = false, $list = array())
{
foreach($tree as $k => $v)
{
if($parentfound || $k == $parent_id)
{
$rowdata = array();
foreach($v as $field => $value)
if($field != 'children')
$rowdata[$field] = $value;
$list[] = $rowdata;
if($v['children'])
$list = array_merge($list, $this->fetch_recursive($v['children'], $parent_id, true));
}
elseif($v['children'])
$list = array_merge($list, $this->fetch_recursive($v['children'], $parent_id));
}
return $list;
}
Правда там есть пару косяков, но в принципе работает. Если ваш вариант будет работать, оставлю его, а то у меня кода многовато, а я в этом плане придерживаюсть простоты и минимализма
Еще мне проверка не очень нравится
if($category != $url)
{
throw new CHttpException(404, 'Not found');
}
Т.е. тупо сравниваем url в браузере с полученным, помоему это как-то примитивно.