parser

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

 

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

Уфф... Я сделал это.

G_Z 14.07.2004 19:06 / 14.07.2004 19:12

Ну наконец-то сообразил.
Как и думал – всё очень просто.
Но пока думал – чуть не лопнул...

Исходная таблица вида:
 
id	parental_id	uri	title
1	0	products	Продукты
2	1	monitors	Мониторы
3	1	printers	Принтеры
4	1	hdd	Винчестеры
5	1	mice	Мыши
6	1	else	Прочее
7	0	support	Поддержка
8	0	cooperation	Сотрудничество
9	0	about	О сайте
10	0	news	Новости
11	10	archive	Архив
12	11	new	Новое в архиве
Вызов метода:
^tree[]
Собственно код:
#====================================================================================================================================
@tree[]
$sections[^table::load[/_root.cfg]]
## Выдираем из файла разделов id тех разделов, которые имеют детей

$roots_hash[
	^sections.menu{
		$.[$sections.parental_id][1]
	}
]

## Хэш по таблице
$sections_hash[^sections.hash[id]]

## Хэш разделов, которые уже проверялись
$show_childs_hash[^hash::create[]]

^sections.menu{
	^child_out[$sections.id]
}
#====================================================================================================================================

#====================================================================================================================================
@child_out[parental_id][parental_id;show_childs_temp_hash;subsections]
^if(!$show_childs_hash.$parental_id){
## Если не проверяли этот раздел
	$show_childs_temp_hash[
		$.$parental_id[1]
	]
	^show_childs_hash.add[$show_childs_temp_hash]
	^if($roots_hash.$parental_id){
## Если раздел - родитель
		$subsections[^sections.select($sections.parental_id == $parental_id)]
		<section id="$sections_hash.$parental_id.id" parental_id="$sections_hash.$parental_id.parental_id" name="$sections_hash.$parental_id.title" url="^create_link[$sections_hash.$parental_id.id]">
		^subsections.menu{
			^child_out[$subsections.id]
		}
		</section>
	}{
## Если раздел - конечное дитё
		<section id="$sections_hash.$parental_id.id" parental_id="$sections_hash.$parental_id.parental_id" name="$sections_hash.$parental_id.title" url="^create_link[$sections_hash.$parental_id.id]"/>
	}
}
#====================================================================================================================================

#====================================================================================================================================
@create_link[id][id]
$sect_table[^table::create{counter	path}]
$counter(0)
^while(^sections.locate[id;$id]){
	^sect_table.append{$counter	$id}
	$id($sections.parental_id)
	^counter.inc[]
}
^sect_table.sort($sect_table.counter)[desc]
$result[/^sect_table.menu{$sections_hash.[$sect_table.path].uri}[/]/]
$sect_table[]
^memory:compact[]
#====================================================================================================================================
Критика всячески приветствуется.