Вопрос по CMS

Не о CI, но о PHP, интерфейсах и веб-проограммировании

Вопрос по CMS

Сообщение felix » 30 окт 2009, 23:13

Ребята, подскажите пожалуйста, а то я почти в тупике.
В принципе все должно работать, но то что получается начинает смахивать на говнокод.
Итак кратко описываю ситуацию
Есть отдельные модули для работы с
- фотографими
- системой faq
- загрузками
- статьи
- папками (организация иерархии)
- пользователями (идет особняком)
(названные в моем случае расширеними
Модули могут иметь "родителя" и "потомков"
Например папки->фотогафии
Получется обычна фотогелерея (папки в даном случае будуит именоватья галереями, или категорими для фографий)
Или такая структура
Код: Выделить всё
                        |->faq
папки->статьи->
                        |->фотографии

Получается уже структура статьи разбросанные по папкам (категориям) а для каждой статьи можно состаилять небольшую фотогалерею и оставлять коментарии (так, скажем можно назвать систему faq) ведь нет особой разницы если пользователь пишет вопрос и комментраий, обработка одна и та же и те же поля Имя и сам комментарий, или вопрос( как в даном случае)
проблема у меня с определениям АКТИВНОГО раздела
например адресс
Код: Выделить всё
http://site.ru/qwerty/part/part2/page02.htm  

демаю понятет из файла конфигурации считываются параметры раздела qwerty, определяется его тип
Код: Выделить всё
фотографими
- системой faq
- загрузками
- статьи
- папками (организация иерархии)

и загружается необходимый модуль В принципе он и должен быть активным
Дальше, ситуация
Код: Выделить всё
http://site.ru/qwerty/view/name_of_elements/

Понятно, что просматривается уже какой-нить элемент в этом же разделе
Код: Выделить всё
http://site.ru/qwerty/view/name_of_elements/foto/page04.htm

вот тут уже уже для раздела qwerty нужно загрузить на дачернее расширие foto оно как раз и должно быть активным.
Запросы типа
Код: Выделить всё
http://site.ru/qwerty/view/name_of_elements/foto/additem.htm
естественно должны быть направлены к нему (в даном случае не к разделу qwerty, а к foto
Может, что-то наплутал, когда писал это сообщение, но вижу, что сам вряд ли расплутаю этот клубок.
Очень и очень надеюсь на помощь более знающих программистов.
felix
 
Сообщения: 132
Зарегистрирован: 20 окт 2009, 19:17

Re: Вопрос по CMS

Сообщение Tovit » 31 окт 2009, 23:08

...так и не понятно в чем проблема?

Вы запутались в собственной архитектуре?
Фантазия! Фантазия! Она поможет... не форум!
Аватара пользователя
Tovit
Модератор
 
Сообщения: 1226
Зарегистрирован: 15 фев 2009, 17:18

Re: Вопрос по CMS

Сообщение felix » 01 ноя 2009, 00:16

Нет, не запутался.
На примере этого фреймворка...
Есть два Контроллера
foto и news
Код: Выделить всё
http://site.ru/index.php/foto/page/2
http://site.ru/index.php/news/page/4

Соответственно просматривает два разные раздела.
Но есть еще и третий контроллер, для управление комментариями.
Но организация коментрирования одинакова для разных разделов, то достаточно написаить однин контроллер comment и подключать либо к конроллеру foto либо news.
Вот тут меня и инересует организация как это огранизовать. Какой клас или модуль должен подключить как дополнение к news контроллер comments?
---------------
Так, вот пример
Код: Выделить всё
http://site.ru/index.php/foto/view/foto_name.jpg/comment/page/3

Получеется должно быть активно два конроллера foto и cooment
Из контроллера foto будет вызвана функция view и как параметр будет передана строка foto_name.jpg
Дальше нужно отобразить комментарии. Для этого нужно загрузить контроллер comment Вот эту "работу" кто должен выполнить конроллер foto? сам CI этого ж уже не сделает?
felix
 
Сообщения: 132
Зарегистрирован: 20 окт 2009, 19:17

Re: Вопрос по CMS

Сообщение Tovit » 01 ноя 2009, 11:47

Если Вы описываете столь сложную структуру зависимостей между модулями, значит у Вас обязан быть функционал которой объединяет такие модуля а следовательно и комментарии цепляются легким движением.
Если Вас интересует КАК написать такой механизм -- это уже другой разговор. Самое простое, что приходит в голову -- конвейер событий, где события имеют строго описанные структуры допускающие расширения. Тогда у Вас могут быть сообщения вроде ПоказываюФотки_формирую_заголовок или ПоказываюНовости_формирую_конец. А вот зарегистрированные слушатели событий обрабатывают его, и возвращают что-то... если слушателей несколько лучше возвращать всегда массив ответов.

Касательно сегментов строки адреса то можно поступать так -- определили первый вызов с лева на право, он забрал все сегменты, и на выходе оставил те сегменты которые не смог обработать, т.о. управление передается дальше.

В местной wiki описаны несколько вариантов КАК можно вызывать другие контроллеры из уже запущенных.

Советую так же озаботиться проблемой построения урлов. Там же есть пара вариантов для автоматического формирования...
Фантазия! Фантазия! Она поможет... не форум!
Аватара пользователя
Tovit
Модератор
 
Сообщения: 1226
Зарегистрирован: 15 фев 2009, 17:18

Re: Вопрос по CMS

Сообщение felix » 01 ноя 2009, 14:37

С учетом того, что было сказано и динамическом создании разделов.
1) едининый базовый котроллер, к которому направлены все запросы.
2) этот конроллер читает первый сегмент и на основании инфы (из конфигурации) запускает другой нужный контроллер. Все, что не смог обработать этот котроллер (из коммандной строки), он возвращает первому.
3) из оставшейся строки запроса базовый контроллер вытаскивает первый сегмент и опять же на основании этих данных запускает третьий контроолер.. и т.д.
4) каждый из контроллеров что записывает в модель отображения, потом базовый контроллер "выталкивает" это на выход.
5) каждый конроллер читает из ури первый сеггмент, так как по нему определяет параметры раздела (имя БД и т.д.)
примерно так?
---
http://code-igniter.ru/wiki/Modular_Extensions_-_HMVC_5
felix
 
Сообщения: 132
Зарегистрирован: 20 окт 2009, 19:17

Re: Вопрос по CMS

Сообщение Tovit » 01 ноя 2009, 21:38

Да, Вы размышляете в правильном направлении...
С одной лишь поправкой -- очень редки случаи когда нужно вызывать два контроллера руководствуясь урлом... не говоря уже о большем кол-ве.
По крайней мере, я с такими случаями не сталкивался пока. Единственный случай для вызова 2х модулей -- это вызов документа закрепленного за некой рубрикой на сайте. Когда первые сегменты -- это алиасы рубрик, и последний сегмент -- алиас документа. Но все равно, у меня сначала вызывается модуль статических страниц, который и вызывает определение id рубрики документа по строке урла. При этом модуль рубрик возврашает 2 значения -- id найденной рубрики или 0 и часть урла которую он не сумел интерпретировать как путь к документу -- зачастую, это и есть алиас искомого документа. Если id рубрики равен 0, то статические страницы пытаются отыскать документ с алиасом всей строки урла.

Естественно, что перед тем как вызвать модуль статических страниц, урл разбирает ядро (единый контроллер) который вытягивает из строки алиас языка, если таковой имеется и ищет модуль для вызова (проверяя доступность в настройках прямого вызова), если модуль не найден, то это явный статический документ.

added: Я использую модифицированный мною вариант HMVC...
Фантазия! Фантазия! Она поможет... не форум!
Аватара пользователя
Tovit
Модератор
 
Сообщения: 1226
Зарегистрирован: 15 фев 2009, 17:18

Re: Вопрос по CMS

Сообщение felix » 01 ноя 2009, 21:55

Естественно, что перед тем как вызвать модуль статических страниц, урл разбирает ядро (единый контроллер) который вытягивает из строки алиас языка, если таковой имеется и ищет модуль для вызова (проверяя доступность в настройках прямого вызова), если модуль не найден, то это явный статический документ.

вот это не совсем понятно.
По ходу перехода с моей CMS на CI (все-таки решил переделать) :) возникает некоторые сложности, хотя я понимаю, что в итоге выиигрываю больше :)
Относительно урла для просмотра комментрариев скажем к
http://site.ru/index.php/foto/view/foto_name.jpg/comment/page/3/
урл нормальный?
А для добавления новых
http://site.ru/index.php/foto/view/foto_name.jpg/comment/addnode/

Но тут возникает еще одна загвоздка: комментирование некоторых элементов, может быть нужно запретить.
Как контролл comment может "узнать" об этом в контроллера foto?
felix
 
Сообщения: 132
Зарегистрирован: 20 окт 2009, 19:17

Re: Вопрос по CMS

Сообщение Tovit » 02 ноя 2009, 11:54

Если Ваши комментарии могут работать с различными типами содержимого, то Вы как минимум должны хранить вместе с комментарием -- имя типа объекта (читать "контроллера") и id объекта.
Можно даже хранить отдельную табличку со списком пар тип/объект где будет храниться флаг разрешения/запрета комментариев.

Используйте события -- Событие Показать_комментарии, в структуре данных события передается имя вызывающего контроллера и id объекта. А контроллер комментарием, принимая событие определяет, можно ли что-то показывать и в случае таковой возможности, возвращает или чистый html комментариев или некую структуру с комментариями. При этом он сам может искать параметры страницы листинга комментариев и т.п. При этом вызывающий контроллер абсолютно ни о чем не заботиться, кроме как вызвать событие, вывести возвращенные данные.
Фантазия! Фантазия! Она поможет... не форум!
Аватара пользователя
Tovit
Модератор
 
Сообщения: 1226
Зарегистрирован: 15 фев 2009, 17:18

Re: Вопрос по CMS

Сообщение felix » 29 дек 2009, 10:59

Нf время пришлось забросить написание CMS теперь все вспоминать...
Итак, имеем несколько модулей (включает контроллер, модуль, отображение) для работы с
Код: Выделить всё
папками (организация иерархии)
фотогаллерея
комментариями
......

Все-таки не могу понять как должны стыковаться модули. Есть контроллер postcontroll.php который грузиться, если не найден по-умолчанию. Это я подправил файл роутера.
Так вот урлы типа
http://site.ru/foto/nature/trotic/ocean/page2.htm

postcontroll.php должен загрузить модуль для работы с папками. Этот модуль вытащить строку nature/trotic/ocean/, пройти по структуре, вывести в браузер все подпапки в данной папке и т.д. вернуть id последней папки и сегмент, что не обработал (page2.htm)
потом, postcontroll.php грузит модуль для работы с фотками, инициализирует его id, который вернул модуль для работы с папками, и сегментом (page2.htm) модуль для работы с фотками, извлекает записи из БД
SELECT COUNt (*) FROM fotos where `parentid`=id
определяет количество записей, парсит свой сегмент, определяет, что нужна вторая страница и т.д. выводит записи. Все..
-----------
урл типа
http://site.ru/foto/by-author/petia/page3.htm

Так тут модуль для работы с папками вообще не нужен
postcontroller.php может сразу смело грузить модуль для работы с фотогаллереей?
Или так же грузит модуль для работы с папками, а он определяет, что "все не его" возвращает Id=0, и что не обработал ни одного сегмента..
а модуль foto уже разбирается что к чему
SELECT COUNT (*) FROM fotos WHERE `author`='petia'

----------------------
урл типа
http://site.ru/foto/ocean_life/show.htm

postcontroller.php снова должен грузить только модуль для работы с фотогаллереей.
Как и кто должен определить, нужен ли модуль для работы с папками или нет?
felix
 
Сообщения: 132
Зарегистрирован: 20 окт 2009, 19:17

Re: Вопрос по CMS

Сообщение Tovit » 29 дек 2009, 14:23

Это должно решать ядро. Или же, как Вы и описали, если модуль папок не нашел разрешения урла, он возвращает код ошибки, тогда вызывается другой модуль обслуживающий урл.
Фантазия! Фантазия! Она поможет... не форум!
Аватара пользователя
Tovit
Модератор
 
Сообщения: 1226
Зарегистрирован: 15 фев 2009, 17:18


Вернуться в Общие вопросы по PHP и веб-программированию

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron