Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
sly 17.08.2004 19:08
Вот такие ответы я уважаю. И не только я. Все.############################## # 19:07 17/08/2004 sly # Основано на TNavigation от Sumo @CLASS TNavigationDB ############################## # Запускаем @Init[] $sitename[$env:SERVER_NAME] $temptable[^table::sql{ SELECT id, pid, uri, title, is_published, is_admin FROM sections }] $hashTree[^CreateHashTree[$temptable;pid]] $root[^GetSectionsByParent[0]] ^rem{ *** Корневые *** } $roll[^Roll[]] ############################## # Хэш для ускорения поиска @CreateHashTree[sections;field] $result[^sections.hash[$field][$.distinct[tables]]] ############################## # Сдвиг для urisplit. Поэтому система будет работать не только в корне сайта @Roll[] $urisplit[^MAIN:ENGINE.ROOT.lsplit[/]] $result[^urisplit.count[]] ############################## # Счетчик вложенных секций у указанного родителя @SectionsCount[pid][tempsection;count] # Вычисляем количество записей $result(0) $tempsection[^GetSectionsByParent[$pid]] ^result.inc($tempsection) ############################## # Возвращает таблицу секций-детей @GetSectionsByParent[pid][tempsection] $result[^table::create{id pid uri title is_published is_admin}] ^if($hashTree.[$pid]){ $tempsection[$hashTree.[$pid]] ^tempsection.menu{ ^if($tempsection.pid==$pid){^result.append{$tempsection.id $tempsection.pid $tempsection.uri $tempsection.title $tempsection.is_published $tempsection.is_admin}} } } ############################## # "Хлебные крошки" @BreadCrops[] # Роемся в подразделах, чтобы выцепить текущий. После этого кидаем крошки # Инициализируем secondnav и записываем в него главную страницу $self.secondnav[^table::create{uri title}] ^self.secondnav.append{$MAIN:ENGINE.ROOT $sitename} # Разбираем uri $uri[$request:uri ] $urisplit[^uri.lsplit[/]] # Проходим по urisplit ^urisplit.menu{ ^if((^urisplit.line[] > $roll) && (^urisplit.line[] < $urisplit)){ ^if(^urisplit.line[] == 1+$roll){ ^if(^root.locate[uri;$urisplit.piece/]){ $currentid[$root.id] ^secondnav.append{^if(^urisplit.line[] != ($urisplit - 1)){${MAIN:ENGINE.ROOT}$root.uri} ^taint[as-is][$root.title]} } $currenturi[$root.uri] }{ $tempsection[^GetSectionsByParent[$currentid]] ^if(^tempsection.locate[uri;$urisplit.piece/]){ $currentid[$tempsection.id] ^secondnav.append{^if(^urisplit.line[] != ($urisplit - 1)){${MAIN:ENGINE.ROOT}${currenturi}$tempsection.uri} ^taint[as-is][$tempsection.title]} } $currenturi[${currenturi}$urisplit.piece/] } } } ^secondnav.menu{ ^if(def $secondnav.uri){ <a href="$secondnav.uri" class=secondnav>^taint[as-is][$secondnav.title]</a> }{ <b>^taint[as-is][$secondnav.title]</b> } }[ ^;> ^;] ############################## # Корневая навигация. Вынесено для удобства (обычно на всех страницах присутствует) @ShowRoot[] ^root.menu{ ^if($root.is_published){ ^if($root.uri eq $request:uri){ <a href="${MAIN:ENGINE.ROOT}$root.uri"><b>^taint[as-is][$root.title]</b></a> }{ <a href="${MAIN:ENGINE.ROOT}$root.uri">^taint[as-is][$root.title]</a> } } } ############################## # Подразделы @ShowSecondNav[][tempsection] ^if($request:uri ne $MAIN:ENGINE.ROOT){ # Разбираем uri $uri[$request:uri ] $urisplit[^uri.lsplit[/]] # Проходим по urisplit, чтобы вычислить id текущей секции ^urisplit.menu{ ^if((^urisplit.line[] > $roll) && (^urisplit.line[] < $urisplit)){ ^if(^urisplit.line[] == 1+$roll){ ^if(^root.locate[uri;$urisplit.piece/]){ $currentid[$root.id] } $currenturi[$root.uri] }{ $tempsection[^GetSectionsByParent[$currentid]] ^if(^tempsection.locate[uri;$urisplit.piece/]){ $currentid[$tempsection.id] } $currenturi[${currenturi}$urisplit.piece/] } } } $tempsection[^GetSectionsByParent[$currentid]] ^tempsection.menu{ ^if($tempsection.is_published){ ^if($tempsection.uri eq $request:uri){ <a href="$tempsection.uri"><b>^taint[as-is][$tempsection.title]</b></a> }{ <a href="$tempsection.uri">^taint[as-is][$tempsection.title]</a> } } }[<br>] } ############################## # Дерево. Будет в XML. Рекурсия (метод вызывает сам себя) @ShowSectionsByParent[pid;parent_uri][tempsection] <ul> ^if($hashTree.[$pid]){ $tempsection[$hashTree.[$pid]] ^tempsection.menu{ ^PrintTreeItem[$tempsection.fields;$parent_uri;^if($hashTree.[$tempsection.id]){^ShowSectionsByParent[$tempsection.id;${parent_uri}$tempsection.uri]}] } } </ul> ############################## # Пририсовать ветку @PrintTreeItem[tempsection;parent_uri;child] $result[<li><a href="${MAIN:ENGINE.ROOT}${parent_uri}$tempsection.uri">^taint[as-is][$tempsection.title]</a>$child</li>]Всего 1 запрос - тока я считаю, что в конструкторе ему самое место. Если я ошибаюсь по техническим понятиям (много памяти) - поправьте. Но все остальное получилось хорошо.