Страницы на сайте

Духовность™

Продвинутый новичок
Страницы на сайте

Здравствуйте. Помогите решить проблему. Нужно сделать на сайте механизм страниц (модуль страницы), при котором можно было бы строить древовидные сущности. Как, например, в мануале: http://www.php.net/manual/en/reserved.variables.php

Я крайне смутно представляю, как сделать структуру таблицы. Предполагаю, что обычное дерево, только не понятно, нужно ли отдельно от самих страниц хранить структуру дерева?

В общем, посоветуйте мне какое-нибудь решение, что бы можно было бы сделать максимально универсальный модуль "страницы". Может кто расскажет как он это делает?..

Спасибо.
 

Beavis

Banned
triumvirat
страницы в таблице базы хранятся? ну если 1 страница может быть только в одном месте, добавь просто parent_id и всё
 

Духовность™

Продвинутый новичок
Beavis
в смысле "только в одном месте"


меня вообще интересует, как люди делают текстовые страницы и их структуру.
 

Krishna

Продался Java
Здравствуйте. Помогите решить проблему. Нужно сделать на сайте механизм страниц (модуль страницы), при котором можно было бы строить древовидные сущности. Как, например, в мануале: http://www.php.net/manual/en/reserved.variables.php
меня вообще интересует, как люди делают текстовые страницы и их структуру.
http://www.php.net/source.php?url=/manual/en/reserved.variables.php
 

Духовность™

Продвинутый новичок
Krishna
Ну я так понимаю, что мануал - это сгенерированный php и html код. Если нет, то я такой вариант не рассматриваю, мне нужно все автоматизировать.
 

damngood

Мозг был, но ушел...
triumvirat
Я храню разделы в виде id-parent_id, так как для меня это самый приемлемый метод. Есть таблица в БД, описывающая всю структуру сайта, плюс несколько дополнительных, которые содержат ссылки на контроллеры, шаблоны и каскадные таблицы.

Просто я не совсем понял вопроса посмотрев ссылку, сори =(
 

dimagolov

Новичок
triumvirat, у тебя страницы типа иерархической структуры, то есть каждая может иметь дочек, ссылки на которые модуль добавляет сам или дает их перечень в шаблон?
 

Духовность™

Продвинутый новичок
у тебя страницы типа иерархической структуры, то есть каждая может иметь дочек, ссылки на которые модуль добавляет сам или дает их перечень в шаблон?
у меня ничего нет. я просто хочу сделать модуль "страницы" на сайте, что бы клиент мог сделать себе структуру разделов типа

О компании "Рога & Копыта"
-- Кто мы
-- Наш коллектив
---- Менеджеры
---- Программисты
-- Наш офис
-- Пресс-центр
---- СМИ
---- Логотипы и документы
 

Krishna

Продался Java
Уж хотя бы nested sets надо пользовать, если в базе дерево хранить.
Я вот кое-где делал дерево в виде xml.
 

r4sh

Новичок
Я использую деревья nested sets + отдельные таблицы с текстовой инфой + таблицы связей. Ну это в самом простом варианте. Еще наворочены динамические атрибуты и еще leaf'ы на узлы нестед сетс. В итоге получатся довольно сложная структура.
 

damngood

Мозг был, но ушел...
triumvirat

У меня это реализовано так:

CREATE TABLE IF NOT EXISTS `adm_urls` (
`url_id` int(11) NOT NULL auto_increment COMMENT 'ID =)',
`url_parentid` int(11) NOT NULL default '0' COMMENT 'Идентификатор родительского раздела. Ноль означает корневые разделы.',
`url_isroot` enum('Y','N') NOT NULL default 'N' COMMENT 'Является ли раздел индексным (начальным разделом сайта / корнем)',
`url_sortorder` int(11) NOT NULL default '0',
`url_sectionname` varchar(250) NOT NULL COMMENT 'Название разделе, то, что будет в тэге <h1>',
`url_meta_description` text NOT NULL COMMENT '<meta description> сайта',
`url_meta_keywords` text NOT NULL COMMENT '<meta keywords> сайта',
`url_title_text` varchar(250) NOT NULL COMMENT 'html <title>текст</title>',
`url_path` varchar(250) NOT NULL COMMENT 'Путь - для ЧПУ, латиницей, возможно использовать символ "_" как пробел',
`url_tpl_fileid` int(11) NOT NULL default '0' COMMENT 'Идентификатор файлы представления, используемого в разделе',
`url_active` enum('Y','N') NOT NULL default 'Y' COMMENT 'Является ли раздел активным',
`url_controller` varchar(250) NOT NULL COMMENT 'Имя файла контроллера. (Можно написать динамический обработчик раздела.)',
`url_textcontent` mediumtext NOT NULL COMMENT 'Текстовое содержимое раздела.',
PRIMARY KEY (`url_id`),
KEY `url_parentid` (`url_parentid`),
KEY `url_sortorder` (`url_sortorder`),
KEY `url_tpl_fileid` (`url_tpl_fileid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=32 ;

При запросе на сервер по адресу http://www.site.ru/about/personnel/managers/ будет обработан соответствующий раздел и показан результат с менеджерами компании. (или если не найден - сгенерирована 404 ошибка)
Раздел может быть статичным (содержать чисто текст с разметкой html), либо динамическим (в нашем случае, через контроллер, указанный в url_controller будет вытащена определенна толика информации из mysql)

Весь результат будет завернут в шаблон вывода url_tpl_fileid (url_tpl_fileid - это id шаблона из сосетней таблицы, где есть путь до него в файловой системе сервера. Сам шаблон это разметка html+php код, в виде <?=$this->templateVariable?>)
 

r4sh

Новичок
damngood, как полный путь до корня при высокой вложенности будешь строить, используя зависимости id - parent_id?
 

tardis

lazy
Уж хотя бы nested sets надо пользовать, если в базе дерево хранить.
ну это смотря насколько велико дерево
к тому же в nested sets проблемы с переносом ветви

-~{}~ 10.11.09 15:18:

как полный путь до корня при высокой вложенности будешь строить, используя зависимости id - parent_id?
а в чем проблема? рекурсия совсем простенькая
 

r4sh

Новичок
к тому же в nested sets проблемы с переносом ветви
Там не проблемы, а гемморой. Самая сложная процедура. Но аргументируется тем, что чтение данных производится чаще чем запись. А строить древовидные структуры и пути с nested sets просто - в один запрос.

ну это смотря насколько велико дерево
Я не видел реальных цифр и созданных условий, при которых база на нестед сетс начинает валиться. Тут нельзя сказать, при каких объемах нестед сетс обрушатся.

а в чем проблема? рекурсия совсем простенькая
да, но +1 запрос на каждый уровень вложенности. Возможно это технически субъективное мнение, но как-то неприятна такая перспектива.
 

tardis

lazy
Я не видел реальных цифр и созданных условий, при которых база на нестед сетс начинает валиться.
не, я наоборот имел ввиду, что при небольшой вложенности деревьев использовать вариант с parent_id проще и удобнее
 

damngood

Мозг был, но ушел...
r4sh
Полный пусть до корня высчитывается парсингом разделов. Кладутся туда данные в виде массива со всеми разделами. Для маньягов кеширования, чтобы не дергать базу, сие может класться в сессию/memcache. Хотя мне лично это не нужно было ни разу.

0 => about
1 => about/company
2 => about/company/personnel
3 => about/company/personnel/managers
4 => any_stuff/foo


triumvirat
Через mod_rewrite строка /about/personnel/managers/ передается на переменную, скажем xEngineFilePath=/about/personnel/managers/.
Потом убираются первый и последние слеши, еси есть таковые, а так же убиваются все символы кроме [a-z0-9-_]. Потом все бьется по разделяющим слешам и загоняется в массив
0=>about
1=>personnel
2=>managers

1. То, как сделано у меня, если не нужно заносить раздел в структуру таблицы mysql и что-то редактировать через админку. Для этой темы это не имеет значения, просто сначало парсится так. Ищется файл с именем Controller_About.php где ищется класс Controller_About а в нем метод Controller_About_Personnel_Managers, который если надо вызывает методы из класса модели и далее рендерит раздел, вызвав метод шаблонизатора display

2. То, что нам надо. Если первый пункт в пролете и там не найдено ничего. Соединяемся с БД и вытаскивает оттуда все разделы с корневым типом (parent_id=0) и заданным именем "about". Строим для них ветки и сравниваем. Далее для найденного раздела, есть id шаблона, который ему соответствует, его и показываем.
 
Сверху