Yii Framework Forum: Категории - Yii Framework Forum

Jump to content

  • (2 Pages)
  • +
  • 1
  • 2
  • You cannot start a new topic
  • You cannot reply to this topic

Категории Rate Topic: -----

#21 User is offline   melomaniac 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 182
  • Joined: 14-January 13

Posted 26 March 2014 - 07:41 PM

View PostMihail, on 26 March 2014 - 06:34 PM, said:

я думаю вам надо получить всех потомков данной категории

это делается так
function ShowTree($ParentID)
{  
  $items = array();
  $categories = Category::model()->findAll('parent_id=:parent_id', array(':parent_id'=>$ParentID));
  foreach($categories as $category){
    $items[] = array(
      'model' => $category,
      'items' => $this->ShowTree($category->id);
    );
  }
return $items;
}


если нужен весь список идишников то так
function ShowTree($ParentID, $ids = array())
{  
  $categories = Category::model()->findAll('parent_id=:parent_id', array(':parent_id'=>$ParentID));
  foreach($categories as $category){
    $ids[] = $category->id;
    $ids = $this->ShowTree($category->id, $ids);
  }
return $ids;
}


и возможно тут проблема
$id = $this->ShowTree($category->parent_id);
надо
$id = $this->ShowTree($category->id);
и возможно ешё так
$id[] = $category->id;


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

	

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 в браузере с полученным, помоему это как-то примитивно.
0

#22 User is offline   melomaniac 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 182
  • Joined: 14-January 13

Posted 26 March 2014 - 11:49 PM

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

1. Как я писал выше, проверка на соотвествие категории происходит примитивным способом, т.е.
if($url !== $category.'/')
{
   throw new CHttpException(404, 'Not found');
}


2. Если перейти по ссылке вида /localhost/novosti/kultura/hgkhjk,m.,/ получаю
Error 404
Unable to resolve the request "novosti/kultura/hgkhjk,m.,".

Где это отловить не пойму, т.е. сделать
throw new CHttpException(404, 'Not found');


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

#23 User is offline   Mihail 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 105
  • Joined: 29-June 13

Posted 27 March 2014 - 05:03 AM

View Postmelomaniac, on 26 March 2014 - 11:49 PM, said:

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

1. Как я писал выше, проверка на соотвествие категории происходит примитивным способом, т.е.
if($url !== $category.'/')
{
   throw new CHttpException(404, 'Not found');
}


2. Если перейти по ссылке вида /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
Быстро ссылки:
Yii - http://www.yiiframework.com/download/
Полное руководство по Yii - http://www.yiiframew...de/1.1/ru/index
Class Reference - http://www.yiiframework.com/doc/api/
Расширения - http://www.yiiframew...com/extensions/
1

#24 User is offline   melomaniac 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 182
  • Joined: 14-January 13

Posted 28 March 2014 - 07:25 AM

View PostMihail, on 27 March 2014 - 05:03 AM, said:

по поводу 1 пункта я бы добавил до условия $category = trim($category, '/');
$category = trim($category, '/');
if($url !== $category)
{
   throw new CHttpException(404, 'Not found');
}

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


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


Спасибо :)
0

Share this topic:


  • (2 Pages)
  • +
  • 1
  • 2
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users