| Новости | 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 запрос - тока я считаю, что в конструкторе ему самое место. Если я ошибаюсь по техническим понятиям (много памяти) - поправьте. Но все остальное получилось хорошо.