powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Вопрос по формированию меню навигации
11 сообщений из 11, страница 1 из 1
Вопрос по формированию меню навигации
    #36539621
zion03
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, никак не могу определится, как лучше реализовать вывод меню, есть 3 варианта:
1.Считать все пункты одним запросом в массив и потом обработать.
2.Считывать пункты в массив формирую под запрос для каждого вложения(Будет прилично запросов, будут ли они работать быстрее первого варианта?).
3.Не использовать массивы вообще, сразу перенаправлять пункт на вывод(Вроде как оптимально, но не совсем удобно).
Самый оптимальный вариант, найти среднее между удобством,скоростью и ресурсами.
Кто имеет опыт, помогите с выбором метода.
...
Рейтинг: 0 / 0
Вопрос по формированию меню навигации
    #36539666
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
первый.
...
Рейтинг: 0 / 0
Вопрос по формированию меню навигации
    #36546219
zion03
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Реализовал примерно так,сначала читаем все записи
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 public function create_menu_array(){
      
       $query = DB::query(Database::SELECT,"SELECT  * FROM categories c ORDER BY c.parent_id  ");      
       $query_result=$query->execute();
   
     foreach($query_result as $categories){
               $tree[$categories['id']] = array(
                                                'id'=> $categories['id'],
                                                'name' => $categories['name'],
                                                'parent_id' => $categories['parent_id'],
                                                'level' =>  0 ,
                                                'menu_type'=> $categories['element_id'],
                                                'next_id' => false);

    if (isset($parent_id)) {$tree[$parent_id]['next_id'] = $categories['id'];}

    $parent_id = $categories['id'];     
        } 
        
    $this->PreparationTree($tree, 0 );    
     }

Потом строим по порядку
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public function PreparationTree($tree,$ParentID) {           

  foreach($tree as $row)
  {  
      if ($row['parent_id']==$ParentID )
    {  
      $id = $row['id'];   
      $this->tree[$id]=$row; 
      $this->PreparationTree($tree,$id);   
    }          
    
  }   
  }
Тут вроде все ок. Но вот проблема в том, не знаю как оптимально обернуть это все в <ul><li>
теги.

Такой вот вывод работает только для вывода всего меню. Когда вывожу кусок меню, там начинаются проблемы.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public function PreparationTree($tree,$ParentID,$co= 0 ) {           
  echo '<ul>';
  foreach($tree as $row)
  {  
      if ($row['parent_id']==$ParentID )
    {    
        echo '<li>';     
      $id = $row['id'];  
      $this->tree[$id]=$row;
      echo $row['name']; 
      $this->PreparationTree($tree,$id,$co+ 1 );

      echo '</li>';     
    }          
    
  }
  echo '</ul>';         
  }

В идеале, хочу писать все теги в текущий массив, чтобы потом обработать примерно так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<?php foreach($content as $element){ ?>
  
<?if (isset($element['ul'] ) ){echo '<ul>';} 
   if (isset($element['li'] ) ){echo '<li>';}  
   ?>

<?php if ($element['highlight']){echo '<big>';}?>            
 <a href="<?php echo $element['id']; ?>"><?php echo $element['name'].'((('.$element['level']?></a>   
<?php if ($element['highlight']){echo '</big>';}?>  

<?   if (isset($element['lic'] ) ){echo '</li>' ;}  
     if (isset($element['ulc'] ) ){echo '</ul>';}   
 
   ?>  
<?php } ?>

Может, кто подскажет, как тут лучше быть или ,возможно, использовать другой подход.
...
Рейтинг: 0 / 0
Вопрос по формированию меню навигации
    #36546273
zion03
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Такой вариант почти работает, но за счет того, что я вывожу не все меню, а куски (например со средины и завершаю вывод когда у узла еще есть дети) вариант все-таки глючит.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public function PreparationTree($tree,$ParentID) {           
  global $id;
   if ($ParentID> 0 ){$this->tree[$ParentID]['ul']='<ul>';}  
  foreach($tree as $row)
  {    
     if ($ParentID> 0 ){$this->tree[$ParentID]['li']='<li>';}    
      if ($row['parent_id']==$ParentID )
    {         
      $id = $row["id"]; 
      $this->tree[$id]=$row;
      echo $row['name']; 
      $this->PreparationTree($tree,$id);  
       $this->tree[$id]['lic']='</li>';     
    }          
     
  } 
    $this->tree[$id]['ulc']='</ul>';       
  }
...
Рейтинг: 0 / 0
Вопрос по формированию меню навигации
    #36546330
zion03
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кому не охота читать мой код,можете кинуть свои варианты.
...
Рейтинг: 0 / 0
Вопрос по формированию меню навигации
    #36547273
zion03
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем,сделал я так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
public function printtree(&$tree,$ParentID){
   static $id;
   static $tp='';
   static $tpf='';
 echo '<ul>';
 $tp.='<ul>';
  
  foreach($tree as $row)
  {    
      if ($row['parent_id']==$ParentID )
    {    echo '<li>';  
         $tp.='<li>'; 
      $id = $row['id']; 
      if (isset($tree[$id])){$tree[$id]['h']=$tp; $tp='';}  
      echo $row['name'];
      $this->printtree($tree,$id);  
    $tp.='</li>'; 
      echo '</li>';     
    }          
     
  } 
 
  $tp.='</ul>';    
    $tp=str_replace('<ul></ul>','',$tp);       
      if (isset($tree[$id])){$tree[$id]['f']=$tp; $tp=''; }    
      echo '</ul>'; 
  }

И потом этот массив на вьюху
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 <?php foreach($content as $element){ 
 if (isset($element['h'] ) ){echo $element['h'];}?>
 
<?php if ($element['highlight']){echo '<big>';}?>         
 <a href="<?php echo $element['id']; ?>"><?php echo $element['name'].'((('.$element['level']?></a>   
<?php if ($element['highlight']){echo '</big>';}?>  

<? if (isset($element['f'] ) ){echo $element['f'] ;} ?> 
<?php } ?>

Почти все работает нормально, но иногда не закрываются все теги (в конце).А при выводе echo все рисует 100% правильно.Может кто заметит где глюки в этой рекурсии.
...
Рейтинг: 0 / 0
Вопрос по формированию меню навигации
    #36547619
alexxhub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня получилось вот так, вывожу меню по количеству страниц сайта плюс субменю. Отлично подошло под моностраничный сайт, т.е. все материалы выводятся в странице index.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<?php
		$result_leftmenu = mysql_query("SELECT menu, pages_id FROM pages WHERE submenu=0",$db);
		$myrow_leftmenu = mysql_fetch_array($result_leftmenu);
		do {
			//Проверяем соответствие пункта меню относительно страницы, если равно то перемнную приравниваем к определенному стилю
			if ($pages_id==$myrow_leftmenu['pages_id']) {$active_position = "red_type";} else {$active_position = "";}
			//Выводим пункт меню со стилем, если в предыдущей проверке был результат то пункт будет красного цвета
			echo "<p id=".$active_position."><a href='index.php?pages_id=".$myrow_leftmenu['pages_id']."'>".$myrow_leftmenu['menu']."</a></p>";
			$result_submenu = mysql_query("SELECT menu, pages_id, submenu FROM pages WHERE submenu='$myrow_leftmenu[pages_id]'",$db);
			$myrow_submenu = mysql_fetch_array($result_submenu);
			//Выводим субменю если есть
			if (mysql_num_rows($result_submenu)> 0 ) {
				do {
					echo "<p id='submenu'><a href='index.php?pages_id=".$myrow_leftmenu['pages_id']."&submenu=".$myrow_submenu['pages_id']."'> - ".$myrow_submenu['menu']."</a></p>";
				}
				while ($myrow_submenu = mysql_fetch_array($result_submenu));}
		}
		while ($myrow_leftmenu = mysql_fetch_array($result_leftmenu));
?>
...
Рейтинг: 0 / 0
Вопрос по формированию меню навигации
    #36548591
zion03
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выводить меню проблемы нет никакой, проблема в формировании меню с помощью тегов <ul><li>.
Теги <ul><li> иногда не закрываются в самом конце,а так вся структура формируется правильно.
Там какой-то глюк в рекурсивном заполнении массива тегами, но я что-то не могу понять где...
...
Рейтинг: 0 / 0
Вопрос по формированию меню навигации
    #36549380
zion03
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос жизненно важен,неужели никто никогда не обвертывал вложенное меню тегами <ul><li>
Вроде как тема актуальна, но ни в нете ни на форуме ничего нет.Излагаю ясно и понятно суть проблемы.
Есть массив, отсортированный в порядке следования элементов
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
//структура такова
$tree=array(
 'id'=> $categories['id'],
 'name' => $categories['name'],
 'parent_id' => $categories['parent_id'],
 'level' =>  0 ,
 'h'=>'' //теги которые идут перед выводом узла
 'f'=>'' // теги которые идут после вывода узла
 'menu_type'=> $categories['element_id'])
Хочу в каждый узел в h і f записать теги какие идут перед выводом и после вывода соответственно.

например:
Код: plaintext
1.
2.
3.
echo $tree['h'];  
<a href=''>$tree['name']</a> 
echo $tree['f'];


Выводит:
Код: plaintext
1.
2.
3.
<ul><li>
<a href=''>Первый элимент</a>
</li></ul>
...
Рейтинг: 0 / 0
Вопрос по формированию меню навигации
    #36554378
alexxhub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
попробуй ul в цикл не включать, т.е. примерно так:

echo "<ul>";
...
cicle <li></li>
...
echo "</ul>";
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Вопрос по формированию меню навигации
    #37772782
webone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
function create_treeList($list, $level, $root = 0){
		$options = "";
		foreach($list as $k=>$item){
			if(($item['level']==$level)and($item['root']==$root)){
				$this->options.="<li>".$item['title'];
				
				unset($list[$k]);
				if($level<=$item['max_level']){
					$found = false;
					foreach($list as $kk=>$vv){
						if($vv['root']==$item['id'])
							$found = true;
					}
					if($found) $this->options.="\r\n<ul>\r\n";
					$this->create_treeList($list,$level+1,$item['id']); 
					if($found) $this->options.="</ul>\r\n";
					$this->options.="</li>\r\n";
				}else 
					return $this->options;
			}
		}	
		return $options;
	}
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Вопрос по формированию меню навигации
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]