Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Оптимизация кода


Автор: Assessor 28.9.2008, 13:11
Добрый день.
С точки зрения работоспособности работает на ура, строит правильные списки <ul><li>, нареканий нет, но такое ощущение, что я перемудрил, и есть гораздо проще решение, поэтому прошу взглянуть трезвым взглядом. Во первых не нравиться запрос в цикле, он и больше всех и раздражает.... Во вторых, просто не нравиться, громоздко слишком.

Таблицы
// NESTED SETS (категории)
| id | parent_id | name | tree_left | tree_right | tree_level |
// Страницы
| id | cat_id | name | sort | 

Код

function ISMmenu()
{
    global $dbInit, $settings_table;

    $retMenu    = '';
    $menu        = '';

    // Считываем какое меню у нас установлено
    $query_menu = "
            SELECT pos_menu
                FROM " . $settings_table['settings_menu'] . "
                ORDER BY    id
                LIMIT        1
                ";
    if ($row_menu = $dbInit -> get_row($query_menu))
    {
        $current_level = 0;

        $pos_menu        = $row_menu -> pos_menu;

        $query_cat = "
                SELECT *
                    FROM " . $settings_table['page_cat'] . "
                    ORDER BY        parent_id, tree_left
                    ";
        if ($rows_pageCat = $dbInit -> get_results($query_cat))
        {
            $retMenu .= '<ul id = "navDropTopMenu">';

            foreach ($rows_pageCat as $row_pageCat)
            {
                $cat_id        = intval($row_pageCat -> id);
                $cat_name    = '<a href = "">' . htmlspecialchars_decode($row_pageCat -> name) . '&nbsp;»</a>';
                $tree_left    = intval($row_pageCat -> tree_left);
                $tree_right    = intval($row_pageCat -> tree_right);
                $tree_level    = intval($row_pageCat -> tree_level);

                if ($tree_level === $current_level)
                {
                    $retMenu .= '<li>' . $cat_name;
                }
                else if ($tree_level > $current_level)
                {
                    $retMenu .= '<ul><li>' . $cat_name;
                    $current_level++;
                }


                $query_page = "
                        SELECT id, link, name
                            FROM " . $settings_table['pages'] . "
                            WHERE        approved        = 'Yes'
                            AND            cat_id            = " . $cat_id . "
                            ORDER BY    sort
                            ";
                if ($rows_page = $dbInit -> get_results($query_page))
                {
                    if ($tree_level === $current_level)
                    {
                        $retMenu .= '<ul>';
                    }

                    foreach ($rows_page as $row_page)
                    {
                        $id            = intval($row_page -> id);
                        $name        = htmlspecialchars_decode($row_page -> name);

                        if ($tree_level < $current_level)
                        {
                            $menu = '<ul><li><a href = "#">' . $name . '</a></li></ul>';
                        }
                        else
                        {
                            $retMenu .= '<li><a href = "#">' . $name . '</a></li>';
                        }
                    }

                    if ($tree_level === $current_level)
                    {
                        $retMenu .= '</ul>';
                    }
                }

                if ($tree_level === $current_level && $tree_right - $tree_left === 1)
                {
                    $retMenu .= '</li>';
                }
                else if ($tree_level < $current_level)
                {
                    $retMenu .= '</ul></li><li>' . $cat_name . $menu . '</li>';
                    $current_level--;
                }
            }

            $retMenu .= '</ul>';
        }
    }
    else
    {
        return LANG_ERROR_NOMENUPOS;
    }

    return $retMenu;
}

Автор: SelenIT 28.9.2008, 23:18
Assessor, ну если уж вам как автору код кажется громоздким (и не зря;), то человеку со стороны вникать в него и разбираться, что вы хотели сделать всеми этими маневрами... Это многоуровневое выпадающее меню, я верно понял?

Цитата(Assessor @  28.9.2008,  13:11 Найти цитируемый пост)
// NESTED SETS (категории)

Это не чистые Nested Sets, это гибрид из них и списков смежности. Причем, по беглому взгляду на код, главное преимущество вложенных множеств (возможность легко взять поддерево любого элемента одним запросом) как раз и не используется ;). Неплохая http://phpclub.ru/faq/Tree/Ns?v=zz4#NsLoad про Nested Sets и вообще про деревья в БД есть на PHPclub'е.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)