| Новости | FAQ | Авторы | Документация | В действии | Библиотека |
| Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
dev 02.12.2005 18:20 / 02.12.2005 18:25
Ждем, что скажет автор.@CLASS
uri
# by Maxim Shipko mailto:maxim@shipko.com.ua
# based on http://www.egoroff.spb.ru/portfolio/15.html
###################################################################
# Конструктор, items - таблица (поля: uri, id, title).
@init[items]
$children_of[^items.hash[parent_id][$.distinct[tables]]]
###################################################################
# Необязательный параметр parent_uri - адрес корневой директории, по умолчанию "/".
# Возвращает таблицу (поля: uri, id, title), содержащую полные адреса всех дочерних директорий.
@get[parent_uri]
^if(!def $parent_uri){$parent_uri[/]}
$_items[^table::create{uri id title}]
^_get[$children_of.0;$parent_uri]
$result[$_items]
$_items[]
###################################################################
# внутренний метод, рекурсивно обходит дочерние директории, вычисляет их адреса
# и добавляет их в таблицу _item.
@_get[sibling;parent_uri]
^sibling.menu{
^_items.append{${parent_uri}$sibling.[dir]/ $sibling.id $sibling.title}
^if(def $children_of.[$sibling.id]){
^_get[$children_of.[$sibling.id];${parent_uri}$sibling.[dir]/]
}
}
###################################################################
# Параметр - id директории.
# Возвращает полный адрес директории.
@get_uri[id][_]
$_[^get[]]
^if(^_.locate[id;$id]){
$result[$_.uri]
}{
^throw[uri.missing;$id;Id '$id' not found]
}
###################################################################
# Параметр - полный адрес директории.
# Возвращает id.
@get_id[uri][_]
# возможно, стоит делать ^trim[]:
#$uri[^uri.trim[]]
# Исключаем вариант, когда адрес не содержит закрывающего слеша:
#^if(^uri.left(1) ne "/"){$uri[$uri/]}
$_[^get[$uri]]
^if(^_.locate[uri;$uri]){
$result($_.id)
}{
^throw[uri.missing;$uri;URI '$uri' not found]
}