Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Вопрос по формированию меню навигации / 11 сообщений из 11, страница 1 из 1
24.03.2010, 14:14:25
    #36539621
zion03
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по формированию меню навигации
Доброго времени суток, никак не могу определится, как лучше реализовать вывод меню, есть 3 варианта:
1.Считать все пункты одним запросом в массив и потом обработать.
2.Считывать пункты в массив формирую под запрос для каждого вложения(Будет прилично запросов, будут ли они работать быстрее первого варианта?).
3.Не использовать массивы вообще, сразу перенаправлять пункт на вывод(Вроде как оптимально, но не совсем удобно).
Самый оптимальный вариант, найти среднее между удобством,скоростью и ресурсами.
Кто имеет опыт, помогите с выбором метода.
...
Рейтинг: 0 / 0
24.03.2010, 14:21:33
    #36539666
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по формированию меню навигации
первый.
...
Рейтинг: 0 / 0
27.03.2010, 15:43:18
    #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
27.03.2010, 16:51:51
    #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
27.03.2010, 17:58:34
    #36546330
zion03
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по формированию меню навигации
Кому не охота читать мой код,можете кинуть свои варианты.
...
Рейтинг: 0 / 0
29.03.2010, 00:13:02
    #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
29.03.2010, 10:48:56
    #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
29.03.2010, 16:36:02
    #36548591
zion03
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по формированию меню навигации
Выводить меню проблемы нет никакой, проблема в формировании меню с помощью тегов <ul><li>.
Теги <ul><li> иногда не закрываются в самом конце,а так вся структура формируется правильно.
Там какой-то глюк в рекурсивном заполнении массива тегами, но я что-то не могу понять где...
...
Рейтинг: 0 / 0
29.03.2010, 23:33:20
    #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
01.04.2010, 07:48:55
    #36554378
alexxhub
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по формированию меню навигации
попробуй ul в цикл не включать, т.е. примерно так:

echo "<ul>";
...
cicle <li></li>
...
echo "</ul>";
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
26.04.2012, 17:07:56
    #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
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Вопрос по формированию меню навигации / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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