![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
AntiLL |
|
|||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 4.2.2006 Репутация: нет Всего: нет |
Доброго время суток!
В настоящее время поставлена задача создать универсальную CMS. Встал вопрос как лучше организовывать структуру для сайта, а самое главное где лучше ее хранить. Была идея хранить струтуры сайтов в виде XML, но вроде бы как стало известно, что PHP очень медленно работает с оным. Поэтому не стоит. Кто нибудь знает эта верная инфа? Вроде бы структуру сайта можно хранить в виде Б+ дерьев в БД. Якобы все это дело будет быстрее и оптимальнее. Кто что может посоветовать по этому поводу? |
|||
|
||||
Serkys |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1061 Регистрация: 19.4.2004 Репутация: нет Всего: 22 |
Я продумал структуру с помощью id в БД. Конечно, отследить вручную бывает сложно, но движок всё прекрасно отслеживает. Если надо, распишу подробнее.
|
|||
|
||||
AntiLL |
|
|||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 4.2.2006 Репутация: нет Всего: нет |
Ну если не сложно, то распиши пожалуйста, буду очень признателен.
Ну а в XML то никто не пробовал хранить структуру? |
|||
|
||||
IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 1 Всего: 73 |
AntiLL, если у тебя небольшой проект, то можно и в XML. Когда речь заходит о больших объемах данных, естественно лучше использовать базы данных.
-------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
Serkys |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1061 Регистрация: 19.4.2004 Репутация: нет Всего: 22 |
AntiLL, в принципе ничего заумно сложного. Структура такая:
В БД выделена таблица, содержащая названия всех разделов, их id и rod_id. При обращении к какому-либо разделу через GET передаётся id этого раздела. По этому id ищутся разделы, у которых этот id записан в поле rod_id. Поле rod_id содержит id раздела, в котором расположен этот раздел. Немного муторно, т.к. напрямую через БД сложно отследить структуру, но толковой инфы на эту тему в нете не нашёл и пришлось самому сочинять. |
|||
|
||||
AntiLL |
|
|||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 4.2.2006 Репутация: нет Всего: нет |
Нет, планируется запустить большой проект, поэтому значит XML отпадает.
Поэтому буду реализовывать в таблице БД, по совету Serkys'а. Спасибо! =) Ну тогда еще вопрос напоследок - как получить в пхп полный урл со всеми параметрами открываемой страницы? Помню как получить откуда пришел, а вот текущую чтото не припомню. Подскажите плз.. |
|||
|
||||
Ciber SLasH |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1813 Регистрация: 9.11.2004 Где: С.-Петербург Репутация: нет Всего: 67 |
||||
|
||||
AntiLL |
|
|||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 4.2.2006 Репутация: нет Всего: нет |
Все спасибо всем за помощь! Респект сайту и форумчанам! =)
|
|||
|
||||
CyClon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 3.12.2005 Репутация: нет Всего: 4 |
Хм, а чем передача с помощью GET имен модулей не устраивает? К примеру /?go=download - список файлов.
|
|||
|
||||
Serkys |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1061 Регистрация: 19.4.2004 Репутация: нет Всего: 22 |
||||
|
||||
CyClon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 3.12.2005 Репутация: нет Всего: 4 |
Смысл - не нужно замарачиваться со всякими id и БД, XML. А теперь вопрос: Смысл заморачиватсья? Чтобы был id в адресной строке, для красоты? Тогда MOD_REWRITE? Или я чего-то не понял?
|
|||
|
||||
Grasshopper |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 23.3.2006 Репутация: нет Всего: 1 |
Проблема в том что если вложение больше одного уровня, то придется делать много запросов к бд, чтобы найти родителя родителя, родителя родителя родителя и т.д. |
|||
|
||||
IvanB |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 23.5.2005 Где: Irkutsk Репутация: нет Всего: 5 |
А одним запросом не получится?
--------------------
Закон отладки: Каждая последняя ошибка является предпоследней. |
|||
|
||||
Serkys |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1061 Регистрация: 19.4.2004 Репутация: нет Всего: 22 |
ИМХО много запросов придётся делать при попытке отследить наследование. Но часто это можно и не делать... ![]() Что-то из околостульной части тела мне подсказывает, что нет ![]() |
|||
|
||||
youri |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 17.4.2004 Репутация: нет Всего: 16 |
а можно поподробнее: как связать вместе структуру сайта, которая храниться в БД, и передачу имени модуля через GET? где храняться имена модулей? имеется в виду, что есть index.php, который по имени модуля узнает, какому скрипту передать запрос? можно отказаться от хранения структуры сайта в базе? |
|||
|
||||
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 ![]() Но ничего сложного нету тут вообще!!! |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Для профи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |