[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Меню с неограниченной вложенностью
Shurick
Как правильно организовать Меню с неограниченной вложенностью?

Как я себе представляю - необходимо сформировать два массива и объединить их: основные категории и категория вложенности

допустим пользователь находится на странице: Шпатлевки для финишной отделки

Сухие строительные смеси
--Шпатлевки
-----Шпатлевки для финишной отделки
Лакокрасочная продукция
Напольные покрытия
Инструмент

Запрос основных категорий:


"select id,name,parent from groups where parent='0' "


И запрос вложенности - (рекурсия, возможно через branch(1,2,3) где значение ид материнских каталогов…)




Спустя 18 минут, 15 секунд (3.03.2010 - 11:27) Michael написал(а):
Посмотри тут была похожая темка. Семён задавал вопрос и glock18 ответил.
Там даже код можно посмотреть. rolleyes.gif если надо.

Спустя 39 минут, 9 секунд (3.03.2010 - 12:07) Shurick написал(а):
Цитата (Michael @ 3.03.2010 - 08:27)
Посмотри тут была похожая темка. Семён задавал вопрос и glock18 ответил.
Там даже код можно посмотреть.  rolleyes.gif если надо.

Нашел эту тему. Спасибо!

Но задача заключается не в том что бы выбрать абсолютно все уровни а в том что бы вывести основные категории и все материнские категории относительно выбранного каталога.

Спустя 12 минут, 37 секунд (3.03.2010 - 12:19) Shurick написал(а):
Одним словом вот так вот это должно выглядеть

Спустя 12 минут, 42 секунды (3.03.2010 - 12:32) Семён написал(а):
Там и найден ответ на твой вопрос

Спустя 57 минут, 43 секунды (3.03.2010 - 13:30) Shurick написал(а):
Код просто суппер! но есть один нюанс - если подкатегория всего одна то он ее не выводит

Спустя 2 минуты, 33 секунды (3.03.2010 - 13:32) Семён написал(а):
У меня есть свой доработанный вариант, который был удалён из той темы. smile.gif
Координально отличающийся от варианта Glocka

Спустя 5 минут, 43 секунды (3.03.2010 - 13:38) Shurick написал(а):
было бы здорово одним глазком взглянуть rolleyes.gif

Спустя 22 секунды (3.03.2010 - 13:38) Семён написал(а):
Smarty не юзаешь?

Спустя 36 секунд (3.03.2010 - 13:39) Shurick написал(а):
именно его то я и юзаю

и еще есть один вопрос - чем рекурсия хуже?

Спустя 2 минуты, 21 секунда (3.03.2010 - 13:41) Семён написал(а):
держи чувак:
Это в моей CMS используется, можешь почерпнуть идейки:

	public function Navigator($config = array()) {

$on_page = $config['on_page'];
$page_count = $config['page_count'];

if($this->strfind(QUERY,"viewcat:")) {
$match['cat'] = '|viewcat:([0-9]+\\cool.gif|U';
preg_match_all($match['cat'],QUERY,$out['catvalue'], PREG_PATTERN_ORDER);
$out['catvalue'] = ceil($out['catvalue'][1][0]);
}

$item["on_page"] = $on_page;
$item["page_count"] = $page_count;
$item["alldata"] = $this->database->selectPage($item["total"],"SELECT `id` FROM ?_".$config['catdata']." WHERE `id_cat`=?",$out['catvalue']);
$item["pages"] = ceil($item["total"]/$item["on_page"]);

if($this->strfind(QUERY,"page:")) {
$match['page'] = '|page:([0-9]+\\cool.gif|U';
preg_match_all($match['page'],QUERY,$out['pagevalue'], PREG_PATTERN_ORDER);
$out['pagevalue'] = ceil($out['pagevalue'][1][0]);
} else { $out['pagevalue'] = 1; }

$item["first"] = $item["on_page"]*$out['pagevalue'];
$item["first"] = $item["first"]-$item["on_page"];
$item["data"] = $this->database->selectPage($totalresult,"SELECT * FROM ?_".$config['catdata']." WHERE `id_cat`=? LIMIT ?d,?d",$out['catvalue'],$item["first"],$item["on_page"]);
$item["category"] = $this->database->select("SELECT * FROM ?_".$config['catname']." WHERE `id`=?",$out['catvalue']);
$item["category"] = $item["category"][0];
$item["category"]['title_seo'] = $item["category"]['title_seo_'.$item["category"]['title_lang']];
$item["pagevalue"] = $out['pagevalue'];

for($i=1,$b=1,$c=1; $i<=$item["pages"]; $i++,$b++)
{
if($b == $page_count+1) {
$b = 1; //Reset B;
$c++; //Count Array Key
$pagelist[$c][]['value'] = $i;
} else {
$pagelist[$c][]['value'] = $i;
}
}

$item["pagestcount"] = $c;
$item["couple"] = ($out['pagevalue'] + $page_count - 1) / $page_count;
$item["coupleval"] = (int)$item["couple"];
$item["couple"] = (int)$item["couple"];
$item["couple"] = $pagelist[$item["couple"]];
if($out['pagevalue'] > $page_count) {
$item["couple"]['menu']["back"] = "1";
$item["couple"]['menu']["back_value"] = $pagelist[$item["coupleval"]-1][0]['value'];
}
if($item["coupleval"] < $item["pagestcount"]) {
$item["couple"]['menu']["next"] = "1";
$item["couple"]['menu']["next_value"] = $pagelist[$item["coupleval"]+1][0]['value'];
}


$this->template->assign($config['tpl_name'],$item);

}

Спустя 49 секунд (3.03.2010 - 13:42) Shurick написал(а):
Блин!!!!!!!!!!! Реально работает!!!!!!!!

Одним запросом двух зайцев!!!!!!

Ща буду ковырять! Мега рулёзный ты чел! Огромное спасибо!

Спустя 5 минут, 12 секунд (3.03.2010 - 13:47) Семён написал(а):
У тебя потом будет другая проблемка:
Рекурсия на smarty шаблоне smile.gif))
пиши помогу

Спустя 1 минута, 12 секунд (3.03.2010 - 13:48) Shurick написал(а):
ок спс!

Спустя 1 день, 8 часов, 19 минут, 57 секунд (4.03.2010 - 22:08) Shurick написал(а):
Все же у меня не вышло решить данную задачу. Скрипт glock-ка работает отлично если уровень вложенности не больше 2-х уровней или если необходимо вывести всю иерархию каталога. а многие элементы кода вообще не востребованы (как по моему). Возможно необходимо придумать еще пару запросов но в этом случае не вижу разницы между рекурсией. Остается только рекурсия, много рекурсии.... sad.gif sad.gif sad.gif

Спустя 8 часов, 57 минут, 2 секунды (5.03.2010 - 07:05) qpayct написал(а):
nested sets

Спустя 1 день, 8 часов, 34 минуты, 16 секунд (6.03.2010 - 15:40) Shurick написал(а):
Задача решилась добавлением к категориям значения branch, полученным через рукурсию и записанным при создании категории.

Получаем все основные, дочерние категории и все необходимые категории относительно выбранного каталога



function menu ($id,$branch){GLOBAL $db,$prefix;
$cats=array();
$sql_gp = empty($branch) ? "parent='0'" : "id in (".$branch.") or parent in (".$branch.") or parent=0";
$result=$db->sql_query("select * from ".$prefix."_groups where ".$sql_gp." order by pos");
while ($res=$db->sql_fetchrow($result)) {
$cats[$res['id']] = array('id'=>$res['id'],'parent'=>$res['parent'],'name'=>$res['name']);
}
echo $sql_gp;
$tree=array();
foreach($cats as $id => &$user)
{
if ($user['parent'] == 0)
$tree[$id] =& $user;
else
$cats[$user['parent']]['items'][$id] =& $user;
}
return $tree;
}




<ul>
{foreach from=$tree_left_menu item=x}
<li><a href='{$url_dir}catalogue/{$x.id}.html'>{$x.name}</a></li>
{if $x.items}{include file="tree_left_menu.tpl" tree_left_menu=$x.items}{/if}
{
/foreach}
</ul>


После (лично у меня) разбираем массив через рекурсию smarty

Получился неограниченный уровень вложенности подкатегорий относительно выбранного каталога. Прелесть в том что при одном запросе получаем именно те категории которые относятся к данному каталогу а не весь каталог. Я думаю в каталога с с огромной иерархией это сэкономит время выполнения функции.


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.