![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
AntiLL |
|
|||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 4.2.2006 Репутация: нет Всего: нет |
А как же ты будешь дерево сайта делать? Ну то есть вложенность разделов. Помоему хранить в БД это самый нормальный вариант для создания универсальной CMS. А дальше это уже оптимизировать разве что. |
|||
|
||||
owlet |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 20.2.2007 Репутация: нет Всего: нет |
Я задавался целью сделать движок, совсем не использующий БД для статичных страниц. Нашел два приемлемых для меня варианта хранить структуру:
1. Если сайт небольшой можно всю структуру хранить в одном файле в виде PHP кода (вложенные массивы). Плюсы - не нужно парсить XML - просто инклюдим и все. Научить CMS генерить такой файл не сложно совсем. 2. Если сайт средний, кладем в корень каждой директории стандартный файл - например, menu.dat, содержащий, опять же PHP код такого вида:
Парсим URL страницы, находим все директории, в которые вложена страница - например: http://domain.ru/dir1/dir2/dir3/page.html дает массив: array('', 'dir1/', 'dir1/dir2/', 'dir1/dir2/dir3/') Меню строит функция, которая, в данном случае, читает четыре файла menu.dat из каждой директории и выполняет их eval() для получения меню соответствующего уровня. Структура в этом случае распределена по файловой системе. Но все удобно - под рукой. Плюсы в том, что статичные страницы сайта будут работать, даже если лежит БД. Удобно редактировать навигацию в разделах. Минусы: нужно прочесть некоторое кол-во файлов - от 1 до N; N = кол-во вложенных уровней + 1. Второй вариант работает на среднем по объему проекте, мне удобно. В тех частях сайта, где используются модули, генерирующие контент из БД, навигация по страницам таких модулей возлагается на них же. Думаю, второй подход можно использовать с БД. Первичным ключем можно сделать пути (тот же array('', 'dir1/', 'dir1/dir2/', 'dir1/dir2/dir3/')), а всю структуру директории записать как blob прямо в виде PHP кода, опять же, и выполнять eval(). Тогда все данные для создания меню к конкретной странице берутся одним запросом. Полагаю, будет работать быстро. Это сообщение отредактировал(а) owlet - 21.2.2007, 13:13 |
|||
|
||||
SamDark |
|
|||
![]() Добрый кот ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1424 Регистрация: 25.7.2006 Где: Voronezh Репутация: 0 Всего: 38 |
Вытащить дерево одним запросом ещё как получится. Особенно быстро, если можно организовать обход в ширину.
-------------------- rmcreative.ru — Это жжж неспроста... yiiframework.ru — О фреймворке Yii на русском. reggi — здесь я регистрирую домены |
|||
|
||||
artfabrique |
|
|||
![]() Доктор Дизайн ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 5.2.2006 Где: СПб Репутация: нет Всего: 2 |
ну короче.
У тебя есть в бд таблица site_tree в ней поля ID(int 11) - ИД данного элемента PARENT_ID(int 11) - ИД родительского элемента NAME(VARCHAR 100) - ИМЯ данного элемента TYPE (VARCHAR 100) - ТИП данного элемента. Например, это может быть "tpl","module","section" TPL (VARCHAR 255) - Если тип данного шаблона "tpl" то тут можно записать путь к файлу шаблона для данного элемента. PLACE (VARCHAR 255) -Если тип данного шаблона "tpl" то тут можно записать место,которое заменять что-то вроде {[_place1_]} далее пишем функцию шаблонизатор, которая собирает рекурсивным методов наше дерево и выдает страницу сайта на экран. Например как то так:
--------------------
Я спасу мир! © ЙУХ 0000г. |
|||
|
||||
eee |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 14.4.2008 Где: ХарьковCity Репутация: нет Всего: 1 |
самый простой способ без бд - это именно передавать параметры в урл
в итоге подгрузится скрипт dir/download.php Это сообщение отредактировал(а) eee - 18.5.2008, 19:33 |
||||
|
|||||
ReactOS |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 165 Регистрация: 6.12.2007 Репутация: нет Всего: 33 |
||||
|
||||
Smith |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 17.1.2007 Репутация: нет Всего: 2 |
||||
|
||||
acdcee |
|
|||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 5.7.2007 Репутация: нет Всего: 1 |
Рассмотрите проблему - узнать родителя родителя родителя на примере DOM
Почему бы строку /news/test/test23/test-2/ не разобрать и одной рекурсией вытащить с БД и имена и все параметры не перевести на подобии работы DOM к примеру news родитель и для test и для test23 причем у news два статуса - файловый или статический (простая html страница с БД) и тогда структура будет так #root - корень для news (стартовая страница или страница по умолчанию) |- news - наш модуль от кого будем плясать | - test - вот и наши разделы | - test23 - еще один и обращатся вот так $root =& new MOD(); $news =& $root->item(0) || $root->rootModule; $test = $news->item($news->modCount); а дальше дело фантазии как это реализовать ![]() Добавлено через 4 минуты и 54 секунды $test = $news->item($news->modCount); причем эта запись должна показывать корректно последнего из списка потомков раздела news т.е если после news идет test/test23 - то показать должен и вытащить из массива test23 потому как $news->modCount будет 2 - а как тут быть это уже надо структура класса продумать. Почему если $news->modCount = 2 будет вытащен раздел test23 хотя по идеи он в массиве будет по ключем 1 а не 2 ![]() Но ничего сложного нету тут вообще!!! |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Для профи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |