parser

/faq/faq
/authors/авторы
/docs/документация

/powered_by_parser/в действии
/feedback/куда говорить
/jargon/жаргон

/download/скачать

/examples/примеры
/forum/форум



Поиск по форуму

По умолчанию ключевое слово ищется только в заголовке сообщения.

Ключевое слово:

Фильтровать по автору:



Меню с "неограниченным" уровнем вложенности

Stepan | orlikan@yandex.ru 27.10.2001 18:52

Избитая тема, но тем не менее ещё актуальна для некоторых.
Предлагаю следующие варианты:

1. Если формируется DHTML-меню с помощью массивов и всплывающих слоёв, необходимо следующие:
а) создать mySQL-таблицу:
id title uri level_id length sub sort
1 О компании /about/ 0 2 0 1
2 Новости /about/news/ 1 3 0 1_1
3 Контакты /about/contacts/ 1 3 1 1_2
4 Схема проезда /about/contacts/circuit/ 3 4 0 1_3_1

...где:
id - уникальный идентификатор
title - название раздела
uri - его uri (/uri/)
level_id - id элемента, который является по отношению к текущему главным (в который вложен текущий)
length - кол-во "/" в uri
sub - ключ, указвающий на присутствие дочерних элементов
sort - порядок сортировки по id (1 - основной; 1_1, 1_2 - 2 уровень; 1_2_1, 1_2_2 - 3 уровень и т.д.)

б) непосредственно в _macro.cfg (или в файле скрипта) включить следующий parser-код:
^macro[server;
^var[maxlevel;5]
^var[n;0]
^context[base;^sql[select * from base where level_id=0]
^menu[
^var[n;+;1]
arMenu^var[n] = new Array(^context[root^item[base;id];^sql[select * from base where level_id="^item[base;id]"]^menu["^item[title]","^item[uri]",^item[sub];,]])
]
]

^for[i;3;^var[maxlevel];
^context[base;^sql[select * from base where length='^var[i]' and sub=1 order by id]
^menu[arMenu^item[sort] = new Array(^context[root^item[base;id];^sql[select * from base where level_id="^item[base;id]" order by id]^menu["^item[title]","^item[uri]",^item[sub];,]])
]
]
]
]

В результате организуются массивы с данными. В принципе в структуре tab-файла можно было-бы убрать колонку length и расчитать длинну слэшей в uri соотв. документа через ^length[^match[...]], а колонка sort возможно не понадобиться для dhtml-скриптов с другим принципом работы.

2. Дерево элементов (с той же БД-таблицей) - идеально подходит для организации админ-части (удаление, добавление разделов, редактирование):

^context[root;^sql[SELECT * FROM base order by sort]
^empty[Разделы отсутствуют!;
^var[maxlevel;0]
^menu[
^var[item_level;^length[^match[[a-zA-Z0-9_];g;;^item[uri]]]]
^if[^var[maxlevel]<^var[item_level];^var[maxlevel;^var[item_level]]]
]
^var[maxlevel;+;1]
<table cellspacing=0 cellpadding=0 border=0 width=100%>
^menu[
^var[length;^eval[^length[^match[[a-zA-Z0-9_-];g;;^item[uri]]]-2]]
^if[^var[length]>0;
<tr>
^for[i;1;^var[length];<td width=15><img src=/i/empty.gif border=0 width=15></td>]
<td colspan=^eval[^var[maxlevel]-^var[length]]><a href=edit.html?uri=^item[uri] target=main>^item[title]</a></td>
</tr>
;
<tr>
<td colspan=^eval[^var[maxlevel]]><a href=edit.html?uri=^item[uri] target=main>^item[title]</a></td>
</tr>
]
]
]]
</table>


Может быть я тут слишком "замутил" с таблицей, но тут уж на "вкус и цвет товарищей нет" :).

<<  Вернуться к списку сообщений


E-mail: mailbox@parser.ruCopyright © 1997-2001 Студия Артемия Лебедева