Nested sets: Id по пути - какой способ рациональный?

ccop

Новичок
Nested sets: Id по пути - какой способ рациональный?

Вот на сайте (в хелпе) есть функция получения информации о странице зная только путь. Но она не работает если путь большой (имеется много подкатегорий) и вообще тормозит. Я вот попытлася написать свою функцию, вышло вот что:

PHP:
//Get properties (id, url, template, title, permissions e.t.) of all categories in path
//   path: array of path categories
//  return_array: array that returns as link with informations of categories
	function getPathInfo($path, &$return_array, $root_id=LEFT_ID_ROOT_CATEGORY, $use_prev_cat=USE_PREVIOUS_CAT){
		$return_array=array();//array returns as link

		//Make up query to DB
		$select = "r.cat_left,t.*";
		$table = DB_TREE." as r, ".DB_CAT_INFO." as t";
		$where = "r.cat_id=t.cat_id AND (";
		$pcount=count($path);
		for($i=0;$i<$pcount;$i++)
			$where .= "t.cat_url='".mysql_real_escape_string($path[$i])."' OR ";
		$where .= " 0 )";

		$query = "SELECT ". $select." FROM ".$table." WHERE ".$where;
		$result = $this->db->query($query);
		
		$correct_path = '';
		//Leave needless records, form new path
		$prev_id=$root_id;
		$i=0;
		while($row = $this->db->fetch_array($result)){
			if( $row['cat_left'] == $prev_id+1 ){
				$return_array[$i] = $row;
				$correct_path .= $row['cat_url']."/";
				$prev_id = $row['cat_left'];
				$i++;
			}
		}

		$rcount = count($return_array);
		if( $rcount != 0 && $rcount != $pcount && $use_prev_cat == TRUE || $rcount == $pcount )
			return TRUE;
		else
			return FALSE;
	}
Вопрос будет ли этот вариант рациональным? Есть ли другие способы кроме этого и того, что описан в хелпе?
 

regi

Новичок
я немного не понял, скрипт посмотрел мельком =). путь - имеется ввиду то, что видит/вводит пользователь в адресной строке?
/catalog/articles/php например?
 

kvf77

Red Devil
ccop

я делал так:
получаешь первый кусок пути - это будет родитель
получаешь всю ветку родителя
проходишь по каждому элементу в цикле и "прикладываешь" свой путь
причем у меня при таком подходе те элементы, кторые не являются раздалви помещаются в доп параметры

Пример:
URL: /news/archive/2005/

здесь news будет родителем
archive тоже существует,
а 2005 - это доп параметр для скрипта, такого раздела на самом деле нет

PHP:
    $branch = $pages->SectionBranch($main_id);
    if (FALSE === $branch) {
        $pages->ERRORS_MES = $errors->ErrPrint($pages->ERRORS_MES);
    } else {
        $flag = FALSE; // Have found number of the current unit?
        $rewrite_params = array();
        // Search of number of the current unit
        while (FALSE === $flag) {
            foreach ($branch as $item) {
                // Reception of number of the current unit
                if ($uri == $item['section_full_path']) {
                    $current_id = $item['section_id'];
                    $section = $item;
                    $flag = TRUE;
                }
            }
            // We receive additional parameters
            if (!isset($current_id)) {
                $rewrite_params[] = $uri_array[count($uri_array) - 2];
                unset($uri_array[count($uri_array) - 2]);
                $uri = implode('/', $uri_array);
            }
        }
        $smarty->assign('current_id', $current_id);
        $smarty->assign('current_section_data', $section);
        // Sorting of additional parameters
        if (!empty($rewrite_params)) {
            for ($i = 0;$i < count($rewrite_params);$i++) {
                $page_params[] = $rewrite_params[count($rewrite_params) - $i - 1];
            }
        }
        unset($rewrite_params, $flag, $branch, $uri, $uri_array, $section);
    }
 

clops

Новичок
рекомендую так же пути эти кешировать в отдельном столбце, чтобы не считать каждый раз по новой

а дальше просто -- делаем выборку по кешу -- если ничего нет -- то считаем снова и обновляем кеш если находим запись -- при сдвигах просто надо очистить кеш
 
Сверху