parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Ответ

mashi 06.12.2005 20:48 / 06.12.2005 20:53

Методы @get_uri[id] и @get_id[uri] работают не совсем оптимально.

У меня появилась идея: почему бы не написать класс для работы с деревовидными данными.

Он уже почти готов. На днях выложу.

Работа с ним будет выглядеть примерно так:
^use[tree.p]

# создаем дерево на основе табличных данных
$site[^tree::init[$objects][$.root_path[/] $.current_id[1]]]

# или так 
$site[^tree::load[/objects.cfg][$.root_path[/]]] загружаем из файла

# или так 
$site[^tree::create{1	0	products}[$.root_path[/]]] создаем в формате tab-delimited

# или так 
$site[^tree::create[]] создаем пустой

# после создания дерева доступны поля: 
# ITEM -- хеш текушего элемента дерева, который содержит все поля элемента (id, parent_id, path, full_path, name, sort_order, .... )
# Например, так можно получить поля текущего объекта:
$site.ITEM.full_path
$site.ITEM.parent_id
$site.ITEM.name
$site.ITEM.any_field

# ITEMS -- хэш всего дерева, который содержит хеши всех элементов.
# Например:
$site.ITEMS.[$id].full_path
$site.ITEMS.[$id].name
$site.ITEMS.[$id].any_field




# Методы
^has_children[id] -- возвращает "1" если у заданного элемента есть дети
^set_current_id[id] -- устанавливает текущий элемент дерева (после этого в ITEM есть все поля элемента)
^get_id[full_path] -- выдает id объекта по заданному full_path
^get_ancestors[$.id(2) $.with_self(1) $.start_from[root]] -- Метод выдает таблицу с номерами объектов-предков: от заданого (по умолчанию) до корневого или наоборот.
^delete_item[id] -- удаляет элемент и всех его потомков из дерева
^add_item[id;parent_id;path;additional_fields] -- добавляет элемент в дерево
^save[file_name] -- сохраняет дерево в текстовый файл в формате tab-delimited
^get_xml_map[$.map_tag_name[map] $.item_tag_name[item] $.from_id(0)] --  выдает xml-дерево