Категории

Ок, сейчас гляну. Пока что решил так(гугль сила)


	


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;

	}



Правда там есть пару косяков, но в принципе работает. Если ваш вариант будет работать, оставлю его, а то у меня кода многовато, а я в этом плане придерживаюсть простоты и минимализма :P

Еще мне проверка не очень нравится




if($category != $url)

  {

    throw new CHttpException(404, 'Not found');

  }



Т.е. тупо сравниваем url в браузере с полученным, помоему это как-то примитивно.

Ну сделал вроде, если кому интересно, могу код выложить, того что получилось, правда мне не нравится два момента:

  1. Как я писал выше, проверка на соотвествие категории происходит примитивным способом, т.е.



if($url !== $category.'/')

{

   throw new CHttpException(404, 'Not found');

}



  1. Если перейти по ссылке вида /localhost/novosti/kultura/hgkhjk,m.,/ получаю



Error 404

Unable to resolve the request "novosti/kultura/hgkhjk,m.,".



Где это отловить не пойму, т.е. сделать




throw new CHttpException(404, 'Not found');



Хотел бы услышать ваше мнение по этому поводу :)

по поводу 1 пункта я бы добавил до условия $category = trim($category, ‘/’);




$category = trim($category, '/');

if($url !== $category)

{

   throw new CHttpException(404, 'Not found');

}



другой вариант более правильный это начать с первой категории и проверять если у неё под категория с нужным алиасом если нет то 404

по 2 пункту скорее всего у вас не справился стандартный разборшик ссылок не найдя нужного контроллера он выдал 404

Спасибо :)