| Новости | FAQ | Авторы | Документация | В действии | Библиотека |
| Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
nkostya 08.03.2003 09:01 / 08.03.2003 09:07
У меня была цель написать древовидную структуру навигации сайта с использованием XML.id,parent_id,dir,title 1,0,feedback,Контакты 2,0,press,Новости и пресс-релизы 3,2,news,Новости 4,2,releases,Пресс-релизы 5,3,old,Старые 6,3,new,Новыеи мне надо получить такой вот XML код:
<?xml version="1.0" encoding="$request:charset"?> <sections> <item id="1"> <dir>feedback</dir> <title>Контакты</title> </item> <item id="2"> <dir>press</dir> <title>Новости и пресс-релизы</title> <item id="3"> <dir>news</dir> <title>Новости</title> <item id="5"> <dir>old</dir> <title>Старые</title> </item> <item id="6"> <dir>new</dir> <title>Новые</title> </item> </item> <item id="4"> <dir>releases</dir> <title>Пресс-релизы</title> </item> </item> </sections>Взял часть кода у Егорова и малец дописал:
#######
# работа с URI - формирование списка всех URI сайта
@CLASS
object_uri
#######
# конструктор
@init[items]
# входная таблица разделов
$self.items[$items]
# создание хэша из таблицы для ускорения поиска
$items_hash[^items.hash[id]]
#end @init[]
#######
# получение uri раздела по заданному id
@get_uri[id][parent_id;uri]
$parent_id($id)
^while($parent_id && $items_hash.[$parent_id]){
$uri[$items_hash.[$parent_id].dir/$uri]
$items_hash.[$id].url[$uri]
$parent_id($items_hash.[$parent_id].parent_id)
}
$result[/$uri]
#end @get_uri[]
@convert_xml[]
^if(def $items){
$xml[^xdoc::create{<?xml version="1.0" encoding="$request:charset"?>
<sections>
^oneLevel[0;1]
</sections>}]
}
$result[$xml]
#end @getDocUri_xml[]
#######
# Надо оптимизировать эту часть!!!
@oneLevel[id;next][parent_id;nextLevel]
$nextLevel($next)
$parent_id($id)
$result[
^if(^nextLevel.int(0)){
^items.menu{
^if($items.parent_id == $parent_id){
<item id="$items.id" ^if(in "^get_uri[$items.id]"){in="yes"} ^if("$env:REQUEST_URI" eq "^get_uri[$items.id]"){hit="yes"}>
<title>$items.title</title>
<dir>$items.dir</dir>
^oneLevel[$items.id;^if(^items.locate[parent_id;$parent_id]){1}{0}]
</item>
}
}
}]
#end @oneLevel[]И вызываю так: @auto[]
$date_now[^date::now[]]
^connect[$SQL.connect-string]{
^use[uri.p]
#######
# Загрузка информации о всех папках
$t_sections[^table::sql{
SELECT
id,
parent_id,
dir,
title
FROM
sections}]
}
}
@main[]
$URI[^object_uri::init[$t_sections]]
$URI_xml[^URI.convert_xml[]]
$response:body[^URI.string[]]Но, как я понимаю, эта конструкция не оптимальна, потому что перебор всех папок делается при каждой новой вложености.