Делаем древовидное меню под Fapos

Smarty error: [in evaluated template line 10]: syntax error: unrecognized tag: while($menu_tree = mysql_fetch_assoc($tree_res)) { echo '<ul>'; echo '<li><a href="/stat/section/' . $menu_tree['id'] . '">' . $menu_tree['title'] . ' (' . $menu_tree['cnt'] . ')</a>';   //эта часть если ты не уверен что у тебя есть 2 уровень, ты проверяешь на наличие детей это пункта меню         $sub_tree_res = mysql_query("SELECT stat_sections.title, stat_sections.id, (SELECT COUNT(*) FROM `stat` WHERE `section_id` = ' ".$menu_tree['id']." ' and `available` = '1' ) as cnt FROM stat_sections WHERE section_id = ' ".$menu_tree['id']." ' ");         if (!empty($sub_tree_res))         { echo '<ul>'; while($sub_menu_tree = mysql_fetch_assoc($sub_tree_res))                 { echo '<li><a href="/stat/category/' . $sub_menu_tree['id'] . '">' . $sub_menu_tree['title'] . ' (' . $menu_tree['cnt'] . ')</a></li>';                
Smarty error: [in evaluated template line 10]: syntax error: unrecognized tag ''
Smarty error: [in evaluated template line 23]: syntax error: unrecognized tag:     $sections = array();     $categories = array();     foreach ($stat as $row) {         if ($row['section_id'] == 0) {             $sections[$row['id']] = $row;        
Smarty error: [in evaluated template line 23]: syntax error: unrecognized tag ''
Smarty error: [in evaluated template line 23]: syntax error: unrecognized tag:             if (!isset($categories[$row['section_id']])) {                 $categories[$row['section_id']] = array();            
Smarty error: [in evaluated template line 23]: syntax error: unrecognized tag ''
Smarty error: [in evaluated template line 23]: syntax error: unrecognized tag:     $out .= '<li><a href="/stat/section/' . h($section['id']) . '">' . h($section['title']) . ' (' . $section['cnt'] . ')</a>';     if (!empty($categories[$section['id']])) {         $out .= '<ul>';         foreach ($categories[$section['id']] as $cat) {             $out .= '<li><a href="/stat/category/' . h($cat['id']) . '">' . h($cat['title']) . ' (' . $cat['cnt1'] . ')</a></li>';        
Smarty error: [in evaluated template line 23]: syntax error: unrecognized tag ''

Одна из прикольных фишек сайта это древовидное меню. 
Причем хотелось бы что бы это меню автоматически выбирало все категории и разделы из базы и само формировалось.

Вот в поисках этих решений я и отправился по интернет ресурсам. Конечно же основным ресурсом где я черпал информацию был официальный сайт CMS Fapos, а конкретно его форум и тема с готовыми снипетами.
Там было найдено как вывести все категории статей с количеством материалов к ним. Это собственно и воодушевило на поиски решения как же к этому еще добавить вывод не только категорий, но и разделов. Ну или вывод разделов и к ним категорий... Ну а совсем правильно это вывод Разделов статей в первом уровне меню и категорий статей во втором уровне меню.

Ну в общем суть дела вы поняли... Теперь перейдем к решению этого вопроса.
Первым что было найдено это сделать на каждый уровень меню по своему запросу. В итоге получилась вот такая структура:
 

$tree_res = mysql_query("SELECT stat_sections.title, stat_sections.id, (SELECT COUNT(*) FROM `stat` WHERE `section_id` = `stat_sections`.`id` and `available` = '1' ) as cnt FROM stat_sections WHERE class = 'section'");    //после этого не мешало бы проверку поставить вернул ли что-нибудь запрос     if (!empty($tree_res))  echo '</ul>';         } echo '</li>'; echo '</ul>'; }  }



Оно работало и неплохо работало. Соответственно каждый сам накатывает на него дизайн и делает что бы оно либо скрывалось либо еще как...

Но вот пообщавшись с разработчиком CMS Fapos данный вариант был забракован.

Все дело в том что на каждый пункт меню происходит запрос к базе данных. Соответственно если у вас будет 20 пунктов меню то, как мне объяснили, будет произведено 21 запрос в базу... Конечно возможно это для кого то и не критично, но захотелось чего то большего :) ну или лучшего.

В результате я замучил Дрюню и он мне сделал правильный код который выбирал все необходимые параметра из базы одним запросом и засовывал его в массив. А  получившийся массив соответственно разбирали и клали куда нужно.

В результате был рожден следующий код:
 

$stat = $FpsDB->query("SELECT `stat_sections`.`title`, `stat_sections`.`id`, `stat_sections`.`section_id`, (SELECT COUNT(*) FROM `stat` WHERE `section_id` = `stat_sections`.`id` and `available` = '1' ) as cnt, (SELECT COUNT(*) FROM `stat` WHERE `category_id` = `stat_sections`.`id` and `available` = '1' ) as cnt1  FROM `stat_sections`");    if (count($stat) > 0)  else              $categories[$row['section_id']][] = $row;         }     } }  $out = '<ul >'; foreach ($sections as $key => $section)          $out .= '</ul>';     }    $out .='</li>'; } $out .= '</ul>';   echo $out;



В данном коде производится выборка из базы разделов и категорий статей, для каждой подсчитывается количество материалов находящихся в них. При этом игнорируются материалы скрытые от просмотра.

Данный скрипт тоже выложен на официальном сайте Фапоса в разделе готовых снипетов.

p.s. и помните что при запихивании данного кода в сниппет писать теги

<?php

 и

?>

 не нужно.

Размещено: 10.10.2011