Новости | 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[]]Но, как я понимаю, эта конструкция не оптимальна, потому что перебор всех папок делается при каждой новой вложености.