parser

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

 

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

Вот тебе еще вариант ...

Sumo 16.09.2002 22:54

Идея следующая:
в корне лежит файл _root.cfg с главным меню (структура описана в исходниках). В директориях, где тебе нужны подразделы лежат файлы _section.cfg в которых описана структура подраздела. Вложенность не ограничена.

tnavigation.p
## Класс TNavigation
##
## 1. В переменную Sroot загружается файл /_root.cfg, содержащий основное меню сайта
##    Структура файла:
##       uri/title/status/... [любое количество дополнительных полей]
##     поле status может содержать одно из значений:
##       hide   - скрыто в основном меню, 
##       admin  - только для администратора
##	 
## 2. Если в текущей папке находится файл _section.cfg, то грузим его в переменную $section
##    Структура файла:
##       uri/title/... [любое количество дополнительных полей]
##     если в поле uri стоит знак ~, то это не ссылка, а начало новой секции
##     если поле uri не определено, то это ссылка на текущий раздел
## 
## 3. Методы:
##       Init[] - инициализация переменных
##       SecondNav[] - строит таблицу со вторичной навигацией ("градусник", "хлебные крошки") 
##                     и записывает ее в переменную secondnav.
##                     
##
##

@CLASS
TNavigation

## ***********************************
##       Инициализация переменных
## ***********************************
@Init[]

  $sitename[$env:SERVER_NAME]
  
## Загружаем главное меню сайта
  $root[^table::load[/_root.cfg]]

## Вычисляем количество записей
  $rootcount(0)
  ^root.menu{
     ^if(def $root.status){}{
        $rootcount($rootcount + 1)
     }
  }

## ***********************************
##        Вторичная навигация
## ***********************************
@SecondNav[][tempsection]

## Инициализируем secondnav и записываем в него главную страницу
   $self.secondnav[^table::create{uri	title}]
   ^self.secondnav.append{/	$sitename}

## Разбираем uri
   $uri[$request:uri ]
   $urisplit[^uri.lsplit[/]]
   
## Проходим по urisplit
   ^urisplit.menu{
     ^if((^urisplit.line[] > 1) && (^urisplit.line[] < $urisplit)){
        ^if(^urisplit.line[] == 2){
           ^if(^root.locate[uri;/$urisplit.piece/]){
             ^secondnav.append{^if(^urisplit.line[] == ($urisplit - 1)){}{$root.uri}	^taint[as-is][$root.title]}
           }         
           $currenturi[$root.uri]
        }{

##         Если в текущей папке есть файл _section.cfg, то ищем в нем
           ^if(-f "${currenturi}_section.cfg"){
              $tempsection[^table::load[${currenturi}_section.cfg]]
              ^if(^tempsection.locate[uri;$urisplit.piece/]){
                 ^secondnav.append{^if(^urisplit.line[] == ($urisplit - 1)){}{${currenturi}$tempsection.uri}	^taint[as-is][$tempsection.title]}
              }
           }
           $currenturi[${currenturi}$urisplit.piece/]

         }
     }
   }   
   
   
   
@ShowSecondNav[]
   ^SecondNav[]
   ^secondnav.menu{
      ^if(def $secondnav.uri){
         <a href="$secondnav.uri" class=secondnav>^secondnav.title.lower[]</a>
      }{
        <b>^secondnav.title.lower[]</b>
      }
   }[&nbsp^;>&nbsp^;]


@ShowRoot[]
  ^root.menu{
    ^if(def $root.status){}{
      ^if($root.uri eq $request:uri){
        <a href="$root.uri"><b>$root.title</b></a><br>
      }{
        <a href="$root.uri">$root.title</a><br>
       }
    }  
  }
где нужно в auto.p что-то такое:
  $nav[^TNavigation::Init[]]
  ^nav.ShowSecondNav[]