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

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