X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Скилет многоуровневого меню [может кому пригодится]
Witu
Witu
Topic Starter сообщение 28.4.2012, 17:58; Ответить: Witu
Сообщение #1


Собственно есть скилет многоуровневого меню собирающегося из базы без всяких там заумных десятков запросов (не помню название скрипта но там использовалась куча JOINов и порядка 15 условий)
структура таблички
CREATE TABLE `menu` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `parent_id` int(10) unsigned DEFAULT NULL,
  `level` tinyint(4) unsigned DEFAULT NULL,
  `label` varchar(50) DEFAULT NULL,
  `uri` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED;

код генерации меню
[php]
function generate() {
$query = mysql_query('SELECT * FROM menu ORDER BY level DESC') or die(mysql_error());
$items = array();
while($item = mysql_fetch_assoc($query)) {
$items[$item['id']] = $item;
}

$tmp = &$items;
foreach ($items as $key => $value) {
if ($value['parent_id'] > 0) {
$items[$value['parent_id']]['pages'][$key] = $value;
}
if ($value['parent_id'] != 0) {
unset($items[$key]);
}
}

asort($items);
return $items;
}
[/php]
начальные данные таблицы (все придельно понятно)
INSERT INTO `menu` VALUES ('1', '0', '0', 'Home', '/');
INSERT INTO `menu` VALUES ('2', '0', '0', 'News', '/news');
INSERT INTO `menu` VALUES ('3', '2', '1', 'All', '/news/all');
INSERT INTO `menu` VALUES ('4', '3', '1', 'Archive', '/news/archive');
INSERT INTO `menu` VALUES ('5', '0', '0', 'Catalog', '/catalog');
INSERT INTO `menu` VALUES ('6', '5', '1', 'Transport', '/catalog/transport');
INSERT INTO `menu` VALUES ('7', '5', '1', 'Electronic', '/catalog/electro');
INSERT INTO `menu` VALUES ('8', '6', '2', 'Super cars', '/catalog/transport/super');
INSERT INTO `menu` VALUES ('9', '6', '2', 'Sport carc', '/catalog/transport/sport');
INSERT INTO `menu` VALUES ('10', '7', '2', 'Computers', '/catalog/electro/computers');
INSERT INTO `menu` VALUES ('11', '10', '3', 'iMac', '/catalog/electro/computers/mac');
INSERT INTO `menu` VALUES ('12', '11', '4', '2.3', '/catalog/electro/computers/mac/2.3');
INSERT INTO `menu` VALUES ('13', '12', '5', '1GB', '/catalog/electro/computers/mac/2.3/1gb');

Примерный вариант рендеринга
[php]
function render($items) {
ob_start();
echo '<ul>';
foreach($items as $m => $k) {
echo '<li>';
echo '<a href="' . $k['uri'] . '">' . $k['label'] . '</a>';
if (isset($k['pages'])) {
echo render($k['pages']);
}
echo '</li>';
}
echo '</ul>';
return ob_get_clean();
}
[/php]
Что получается при
[php]
$items = generate();
echo render($items);
[/php]
<ul>
    <li>
        <a href="/">Home</a>
    </li>
    <li>
        <a href="/news">News</a>
        <ul>
            <li><a href="/news/all">All</a>
                <ul>
                    <li><a href="/news/archive">Archive</a></li>
                </ul>
            </li>
        </ul>
    </li>
    <li><a href="/catalog">Catalog</a>
        <ul>
            <li><a href="/catalog/electro">Electronic</a>
                <ul>
                    <li><a href="/catalog/electro/computers">Computers</a>
                        <ul>
                            <li><a href="/catalog/electro/computers/mac">iMac</a>
                                <ul>
                                    <li><a href="/catalog/electro/computers/mac/2.3">2.3</a>
                                        <ul>
                                            <li><a href="/catalog/electro/computers/mac/2.3/1gb">1GB</a></li>
                                        </ul>
                                    </li>
                                </ul>
                            </li>
                        </ul>
                    </li>
                </ul>
            </li>
            <li><a href="/catalog/transport">Transport</a>
                <ul>
                    <li><a href="/catalog/transport/sport">Sport carc</a></li>
                    <li><a href="/catalog/transport/super">Super cars</a></li>
                </ul>
            </li>
        </ul>
    </li>
</ul>


И есть такой вопрос... Есть у кого какие мысли как избeжать вот этого
/catalog/electro/computers/mac
/catalog/electro/computers/mac/2.3
/catalog/electro/computers/mac/2.3/1gb

поскольку это подпункты одного меню было бы логично заносить в базу данные вот так
/catalog
/electro
/computers
/mac
/2.3
/1gb
но...
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
сообщение 28.4.2012, 21:10; Ответить: Arks
Сообщение #2


Самый быстрый алгоритм но к сожалению не юзабельный. Рекурсивный компоновщик чуть медленнее но решает проблему выпадения parent_id(думаю вы понимаете о чем я).
Nested sets тоже быстр, но с медленной вставкой и немереными проблемами при малейшей ошибке вставки, зато позволяет быстро выбирать суб-деревья.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Witu
Witu
Topic Starter сообщение 29.4.2012, 16:43; Ответить: Witu
Сообщение #3


вообщем будет проще использовать Zend_Navigation + роутер и пихнуть в кеш дабы не считывать по 20-30 лишних файлов при каждом открытии страницы

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Кто может разослать ЛС в телеграм?
1 Mixatraider 1008 24.7.2023, 19:47
автор: Mixatraider
Открытая тема (нет новых ответов) Нужно ли кому 3 "вечные" лицухи ISP 5 Lite
Продам за ненадобностью
6 Dani 2812 3.4.2022, 13:17
автор: LigaGiga
Открытая тема (нет новых ответов) Может кто подкинуть бесплатных больших баз сайтов?
23 Himena 13814 1.12.2021, 14:44
автор: Trustobmen
Открытая тема (нет новых ответов) Требуется накрутка ПФ (Яндекс) на мой сайт, кто может сделать ?
0 regem 1945 9.11.2019, 22:04
автор: regem
Открытая тема (нет новых ответов) Кто может прогнать сайт по Адалт доскам/ресурсам
4 TABAK 2083 15.8.2019, 0:33
автор: TABAK


 



RSS Текстовая версия Сейчас: 25.4.2024, 10:45
Дизайн