Fast Site Engine
Высокопроизводительный движок для сайтов
Заказать сайт на основе движка
О движкеПроизводительностьБезопасностьТехнические требованияSEO 
Лицензионное соглашение
Демо
Установка
Панель управления
Модули
Документация
Шаблоны
Тесты производительности php
Планы на будущее
Список изменений
Отзывы и пожелания
Переходим на Линукс
Всякое разное
Документация  »  Пример рекурсивного меню

Пример рекурсивного меню

Вот как построена ёлочка слева на данном сайте, думаю по этому примеру можно сделать что угодно, за основу лучше брать функцию menu() в движке..
В примере не происходит парсинга описания из шаблона, это немного долго, функция итак не особо быстрая из-за рекурсии всего дерева, даёт проседание в половину времени генерации страницы..
Добавляю данные функции обычно в конец /inc/_func.php

PHP
function echomenu($typ, $par1='', $par2='', $par3=''){
  global $menu, $v, $g;
  static $next = 0, $c1 = 0, $c2 = 0, $c3 = 0, $mtyp = '';
  if(!ishave($typ, $par1, $par2, $par3)) return;
  if($mtyp != $typ){
    $c1 = 0;
    $mtyp = $typ;
    //echo 'Смена типа меню';
  }
  $p = 1;
  $i = $c1;
  if(''!=$par1){
        if(''==$par2 && ''==$par3) { $p = 2; $i = $c2; }
    elseif(''!=$par2 && ''==$par3){ $p = 3; $i = $c3; }
    elseif(''!=$par2 && ''!=$par3){ $p = 4; $i = 0; }
  }
  for($w=$i; $w<MENUSIZE; $w++){
    $r = $menu[$w];
    if($r['typ'] == $typ && 'hidden'!=$r['active'] && 'no'!=$r['active']
    && $r['par1'] == $par1 && $r['par2'] == $par2 && $r['par3'] == $par3){
      $x = 'x'.$next;
      $pl = '';
      $ishav=false;
      if($p == 4){
        $xlink = $r['par1'].'/'.$r['par2'].'/'.$r['par3'].'/'.$r['name'];
        $nbsp = '<td width="45"></td>';
      } elseif($p == 3){
        $ishav = ishave($typ, $r['par1'], $r['par2'], $r['name']);
        $xlink = $r['par1'].'/'.$r['par2'].'/'.$r['name'];
        $nbsp = '<td width="30"></td>';
        if($ishav) $pl = '<div class="plus" id="ip'.$x.'" onclick="se(\'p'.$x.'\')"></div>';
      } elseif($p == 2){
        $ishav = ishave($typ, $r['par1'], $r['name']);
        $xlink = $r['par1'].'/'.$r['name'];
        $nbsp = '<td width="15"></td>';
        if($ishav) $pl = '<div class="plus" id="ip'.$x.'" onclick="se(\'p'.$x.'\')"></div>';
      } elseif($p == 1){
        $ishav = ishave($typ, $r['name']);
        $xlink = $r['name'];
        $nbsp = '';
      } $ot = $r['text'];
      $hint = (''!=$r['hint'])? ' title="'.$r['hint'].'"':'';
      $act=' style="display:none"';
      if($r['name']==$g->item($p-1)){
        $act='';
        $pl=($ishav)?'<div class="minus" id="ip'.$x.
        '" onclick="se(\'p'.$x.'\')"></div>':'<div class="vr"></div>';
        echo '<table width="100%"><tr>'.$nbsp.'<td width="15">'.$pl.
        '</td><td id="m'.$w.'"><a href="/'.P.$xlink.
        '" class="onl"'.$hint.'>'.$ot.'</a></td></tr></table>';
      }else{
        $pl=($ishav)?'<div class="plus" id="ip'.$x.'" onclick="se(\'p'.$x.'\')"></div>'
        :'<div class="vb"></div>';
        echo '<table width="100%"><tr>'.$nbsp.'<td width="15">'.$pl.
        '</td><td id="m'.$w.'"><a href="/'.P.$xlink.'"'.$hint.'>'.$ot.
        '</a></td></tr></table>';
      }
      $next++;
      if($p == 3){
        $c3 = $i+1;
        if($ishav) echo '<div id="p'.$x.'"'.$act.'>';
        if($r['name'] != '') echomenu($typ, $r['par1'], $r['par2'], $r['name']);
        if($ishav) echo '</div>';
      } elseif($p == 2){
        $c3 = 0;
        $c2 = $i+1;
        if($ishav) echo '<div id="p'.$x.'"'.$act.'>';
        if($r['name'] != '') echomenu($typ, $r['par1'], $r['name']);
        if($ishav) echo '</div>';
      } elseif($p == 1){
        $c2 = 0;
        $c1 = $i+1;
        if($ishav) echo '<div id="p'.$x.'"'.$act.'>';
        if($r['name'] != '') echomenu($typ, $r['name']);
        if($ishav) echo '</div>';
      }
    }
  }
}
JavaScript: (/inc/_.js)
function se(id) {
  var obj = gid(id).style;
  if (obj.display == 'none') {
    obj.display = '';
    gid('i' + id).className = 'minus';
  } else {
    obj.display = 'none';
    gid('i' + id).className = 'plus';
  }
}
Страница сгенерирована за 0.001932 секунды
На один процесс веб-сервера: 518 стр/сек.
Всего Apache может отдать: 132 608 стр/сек.
Выделено php памяти: ~ 2MB

© Все права защищены 2004 - 2018
Карта сайта
Отслеживать изменения в Твиттере

Браузер построил за сек.
Полное время сек.

С момента выгрузки предыдущей страницы из памяти браузера: сек.