parser

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

 

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

Пожалуйста помогите оптимизировать!

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

Наверное многие писали что-то наподобии такого или даже такое. Пожалуйста поделитесь идеями, мыслями!

P.S. не судите строго, я только учусь.