Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как и где лучше хранить структуру сайта? XML, B+ деревья в БД, файлы... 
:(
    Опции темы
AntiLL
Дата 3.4.2006, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 4.2.2006

Репутация: нет
Всего: нет



Цитата
Хм, а чем передача с помощью GET имен модулей не устраивает? К примеру /?go=download


А как же ты будешь дерево сайта делать? Ну то есть вложенность разделов. Помоему хранить в БД это самый нормальный вариант для создания универсальной CMS. А дальше это уже оптимизировать разве что.
PM MAIL   Вверх
owlet
Дата 21.2.2007, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 20.2.2007

Репутация: нет
Всего: нет



Я задавался целью сделать движок, совсем не использующий БД для статичных страниц. Нашел два приемлемых для меня варианта хранить структуру:

1. Если сайт небольшой можно всю структуру хранить в одном файле в виде PHP кода (вложенные массивы). Плюсы - не нужно парсить XML - просто инклюдим и все. Научить CMS генерить такой файл  не сложно совсем. 

2. Если сайт средний, кладем в корень каждой директории стандартный файл - например, menu.dat, содержащий, опять же PHP код такого вида:

Код

$m[] = array('Главная', '');
$m[] = array('Страница', 'page.html');
$m[] = array('Раздел', 'part/');


Парсим 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
PM MAIL   Вверх
SamDark
Дата 21.2.2007, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

Репутация: 0
Всего: 38



Вытащить дерево одним запросом ещё как получится. Особенно быстро, если можно организовать обход в ширину.


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
artfabrique
Дата 23.2.2007, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Дизайн
*


Профиль
Группа: Участник
Сообщений: 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_]}

далее пишем функцию шаблонизатор, которая собирает рекурсивным методов наше дерево и выдает страницу сайта на экран.
Например как то так:

Код

global $tree_out;
function showSection($sect_name) {
 global $tree_out;
 //получаем по переданному имени ID с которой начать и запускаем рекурсию нашу;
 gatherAll($наш_первый_id);
}

function gatherAll($pid) {
 global $tree_out;
 //Смотрим есть ли у этого элемента дети по бд тоесть есть ли элементы у которых парент_ид равен ид этого эелемента.
 //Запускаем функцию посещения элемента которая собсно будет обрабатывать этот элемент.
 visitElement($current_row); //- $current_row  это ряд уже отфетченный текущего элемента;
 //Если есть то запускаем из этой функции саму себя только уже с ид этого ребенка.
 gatherAll($current_row['id']);
 //Если нет детей то ничего не делаем.
}

function visitElement($row) {
 global $tree_out;
 //Ну а тут все в нашем распоряжении у тя текущая инфа о данном элементе под рукой как хошь так и оперируй с ней.
 //Например если тип данного элемента tpl 
 //заменяем в нашем глобальном выводе с помощью str_replace(); все подстроки которые
 //совпадают с полем PLACE данного элемента на загруженный из файла шаблон путь к которому указан в поле TPL
 //Короче нафонтазировать много можно.
  
}



--------------------
Я спасу мир! © ЙУХ 0000г.
PM MAIL WWW ICQ   Вверх
eee
Дата 18.5.2008, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 14.4.2008
Где: ХарьковCity

Репутация: нет
Всего: 1



самый простой способ без бд - это именно передавать параметры в урл
Код

http://yoursite.com/index.php?go=download

Код

extract($_GET);
// разметка и все другое
include ("dir/".$go.".php"); // dir-каталог где хранятся разделы
// разметка и тра та та

в итоге подгрузится скрипт dir/download.php

Это сообщение отредактировал(а) eee - 18.5.2008, 19:33
PM MAIL WWW ICQ   Вверх
ReactOS
Дата 18.5.2008, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 6.12.2007

Репутация: нет
Всего: 33



Цитата(eee @  18.5.2008,  19:31 Найти цитируемый пост)
самый простой способ без бд - это именно передавать параметры в урл

но по-моему это отходит от смысла топика smile

человек хочет создавать универсальную CMS, наверное такую же мощную, как Drupal, тут только тонкая работа с бд smile
PM   Вверх
Smith
Дата 19.5.2008, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 17.1.2007

Репутация: нет
Всего: 2



Цитата(IvanB @ 23.3.2006,  18:43)
А одним запросом не получится?

http://phpclub.ru/faq/Tree?v=w5u
PM MAIL   Вверх
acdcee
Дата 27.8.2008, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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);

а дальше дело фантазии как это реализовать smile

Добавлено через 4 минуты и 54 секунды
$test = $news->item($news->modCount);

причем эта запись должна показывать корректно последнего из списка потомков раздела news
т.е если после news идет test/test23 - то показать должен и вытащить из массива test23 потому как $news->modCount будет 2 - а как тут быть это уже надо структура класса продумать. Почему если $news->modCount = 2 будет вытащен раздел test23 хотя по идеи он в массиве будет по ключем 1 а не 2
smile

Но ничего сложного нету тут вообще!!!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.1531 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.