|
|
|
ответ
Поле length - это уровень вложенности. Переменная ^var[maxlevel] задаёт кол-во максимальных уровней, и исходя из этого с помощью цикла выбираются соотвествующие этому уровню элементы и сортируются в js-массив:
...^menu[menu_^var[n] = new Array('^item[title]','^item[uri]',^item[sub]);,]... - это формирование элементов первого уровня, т.е. с uri вида /uri/ - соотв. их length=2.
В результате получится следующие:
menu_1 = array('elem1','uri1',0,
'elem2','uri2',0,
'elem3','uri3',1,
'elem4','uri4',0)
menu_2 = array('elem1','uri1',0,...)
Чтобы сформировать последующие уровни, нужен другой блок:
^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];,]])]]]]
Как видите, таблмца base последовательно заполняется в ходе цикла данными из БД, которые выбираются по столбцу length. Цикл начинается с 3, поскольку то же самое мы сделали в прошлом блоке. Кстати, uri представляются в виде /level1/level2/.../, т.е.:
Продукты - /products/
Теливизоры - /products/tele/
Sony - /products/tele/sony/
LG - /products/tele/lg/
и так далее.
Вообще, для заполнения такой таблицы я пользуюсь специально написанным для этого скрипта, я задаю только title, его вариант на английском (для uri) и его положение в дереве. Дерево же рисуется другим скриптиком, который я привёл в начале это темы под пунктом 2. Тем самым я избавляюсь от ручного ввода данных, поскольку программа сама высчитает length, и все остальные данные, а также создаст соотв. директорию с файлом index.html, в который впоследствии остаётся только вписать данные и картинки.
Вообще цель была следующая: вывести массивы с данными для работы dhtml-скрипта с многоуровневым выпадющим меню. В принципе, если задача стоит другая, к ней, соответственно и другой подход :). Можно вообще в БД оставить только title и uri, если требуется выводить данные статически (в навигации по сайту), а число подуровней считать через ^length[^match[[a-zA-Z0-9_-];g;;^item[uri]]].
|