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

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

Вот в поисках этих решений я и отправился по интернет ресурсам. Конечно же основным ресурсом где я черпал информацию был официальный сайт 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)) {
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>';
                }
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) {
    $sections = array();
    $categories = array();
    foreach ($stat as $row) {
        if ($row['section_id'] == 0) {
            $sections[$row['id']] = $row;
        } else {
            if (!isset($categories[$row['section_id']])) {
                $categories[$row['section_id']] = array();
            }
            $categories[$row['section_id']][] = $row;
        }
    }
}

$out = '<ul >';
foreach ($sections as $key => $section) {
    $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>';
        }
        $out .= '</ul>';
    }
   $out .='</li>';
}
$out .= '</ul>';


echo $out;


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

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

p.s. и помните что при запихивании данного кода в сниппет писать теги
<?php
 и
?>
 не нужно.



Категория: 

Оставить комментарий