parser

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

 

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

к обсуждению...

Givi 03.07.2002 20:54

Вот код. К нему нужно ещё сделать файл
sections.dat
Поля, типа :)))
id >> uri >> name >> inscription >> in_menu
( >> - это табуляторы)
@showMainMenu[width;cols] Выводит меню навигации по разделам сайта
#Определяем количество элементов меню
$menuItems[0]
^section.menu{
	^if($section.in_menu!=0){$menuItems($menuItems+1)}
}
#В случае если не задано количество столбцов, оно устанавливается равным количеству элементов меню.
^if(!def $cols || $cols>$menuItems){$cols[$menuItems]}
#В случае если не задана ширина меню, она устанавливается равной 100%.
^if(!def $width){$width[100%]}
#Определяем размер столбцов $columnWidth, в зависимости от их количества и ширины всего меню. Размер может быть указан в процентах, в этом случае, ширина столбца считается как (100/количество столбцов)%, чтобы они все имели одинаковый размер. Если размер не в процентах, то в переменную $rest кладём остаток от деления, который понадобится если нужно чтобы меню точно соответствовало указанному размеру.
$percent[^width.match[(^^[0-9]+)][gi]{$columnWidth[$match.1]}]
^if(def $percent){
	$columnWidth[^eval(100\$cols)$percent]
}{
	$columnWidth[^math:floor(^eval($columnWidth/$cols))]
	$rest($width%$cols)
}
#Определяем количество строк меню.
$rows[^math:ceiling($menuItems/$cols)]
#Формируем хэш $hMenu, имеющий вид $hMenu.строка.столбец[и там ещё параметры].
$endTable(0>1)
$hMenu[
	^for[i](1;$rows){
		$.$i[
#Переменная для контроля цикла.
			$endWhile(0<1)
			$j[0]
			^while($endWhile){
#Проверяем, показывать ли элемент в меню.
				^if($section.in_menu==1){
					$j($j+1)
					$.$j[
#Проверяем, достигнут ли конец таблицы. Если конец таблицы достигнут то оставшиеся элементы пустые.
						^if(!$endTable){
							$.uri[${root}$section.uri]
							$.name[$section.name]
#Проверяем, является ли элемент активным.
							^if($section.id==$sectionId){
								$.state[active]
							}{
								$.state[default]
							}
						}{
							$.uri[]
							$.name[]
							$.state[empty]
						}
					]
					^if($j==$cols){$endWhile(0>1)}
				}
				^if(^section.line[]>=$section){
					$endTable(0<1)
				}{
					^section.offset(1)
				}
			}
		]
	}
	$endTable[]
	$endWhile[]
]
#Выводим таблицу меню.
<table width="$width" border="0" cellspacing="1" cellpadding="2" bgcolor="#000000" class="mainMenu">
^for[i](1;$rows){
	<tr bgcolor="#ffffff">
	^for[j](1;$cols){
		^switch[$hMenu.$i.$j.state]{
			^case[active]{
				<td ^if($i==1){width="$columnWidth" }class="mainMenuActiveItem" bgcolor="#99ccff" align="middle">$hMenu.$i.$j.name</td>
			}
			^case[default]{
				<td ^if($i==1){width="$columnWidth" } class="mainMenuItem" align="middle"><a href="$hMenu.$i.$j.uri">$hMenu.$i.$j.name</a></td>
			}
			^case[empty]{
				<td ^if($i==1){width="$columnWidth" } class="mainMenuItem" align="middle">Q!&nbsp^;</td>
			}
		}
	}
#Если первая строка и определён $rest то добавляем в таблицу столбец, чтоб размер точный был.
#Только всё равно, наверное размер не будет точным поскольку есть ещё cellpadding и cellspacing.
	^if($i==1 && $rest!=0){
		<td rowspan="$rows" width="$rest" bgcolor="#990000"></td>
	}
	</tr>
}
</table>