Помогите с решением: ЧПУ в CMS

bools

Новичок
Помогите с решением: ЧПУ в CMS

Здравствуйте. Решил в своей системе, которую я разрабатываю, сделать возможность создавать такие ЧПУ, которые захочет пользователь, а не сделает программист. Т.е. если программист делает сценарий регистрации пользователей по адресу /registration/ и исправить это без его вмешательства будет невозможно, то хотелось бы предоставить администратору сайта создать страничку регистрации по ЛЮБОМУ URL-адресу с любым уровнем ВЛОЖЕННОСТИ. Например, так: /system/users/registration/.

В процессе работы возникли вопросы, которые не могу решить. А именно:

Если бы мы сразу определились, что уровень вложенности у нас «корневой» и, например, строка новостей /news/2007/08/12/news_name.html всегда будет представлена именно так, то вопросов бы не было – модуль новостей определялся первым элементом в строке среди разделителей «/». Но я задался целью создать МНОГОУРОВНЕВУЮ систему ЧПУ, исходя из чего, модуль новостей может находиться по ЛЮБОМУ адресу, например: /analitika/finansi/Russia/news/2007/08/12/news_name.html.

Как видите, у меня возникла сложность определения конкретного МОДУЛЯ (т.е. модуля новостей в данном случае), ибо остальная часть URL - /analitika/finansi/Russia/ является лишь виртуальной, НИКАК не влияющей на сам модуль новостей частью URL. Т.е. хоть адрес /analitika/, /finansi/ или /Russia/ хоть и будет привязаны к какому-то модулю, но на модуль новостей они влиять никоим образом не будут.

Вот и не знаю, как подобное осуществить, и осуществимо ли это в принципе? Даже алгоритм придумать никакой более-менее логический не могу.

Спасибо.


UPD: пока писал этот текст возникла идея следующего содержания: идти по строке /analitika/finansi/Russia/news/2007/08/12/news_name.html и искать самый последний модуль, т.е. сопоставлять по таблице каждый элемент URL (analitika, finansi, Russia, news, 2007 и т.д.) и, пока мы не поймём, что часть URL «2007» не ассоциируется ни с каким модулем, то выделим как ОСНОВНОЙ МОДУЛЬ страницы модуль news. Покритикуйте это решение..
 

texrdcom

Новичок
Может проще придерживаться правила что в url:
Например:
1) Всегда идет модуль
2) Идет контролер
3) Идет актион
/:modul/:controller/:action/
Остальное параметры
 

StUV

Rotaredom
имхо, урл должен однозначно показывать какой модуль и с какими параметрами подключается
у тебя же скорее всего в итоге получится каша с некими взаимоисключающими алгоритмами парсинга урлов + возможны конфликты имен модулей со значениями параметров

зы: да и зачем это все надо - делать нечего ? ;)
 

Marquis

Новичок
а что если я хочу что бы страница со списком новостей называлась не 'news' а например 'moi_interesnie_novosti' ? :)
 

bools

Новичок
2 Marquis - это к ому вопрос?

2 StUV
>>>имхо, урл должен однозначно показывать какой модуль и с какими параметрами подключается

Должен? Ничего он никому не должен. Вот например: ( http://www.uaz.ru/partnership/pokyp/ ) - тут урл "однозначно показывает" какой модуль подключён?
 

akd

dive now, work later
Команда форума
Marquis, сделать реально, но, по-моему, идти лучше в обратную сторону.
если "очередной" шаг не модуль, то складываем шаг в какое-то поле параметров, когда наконец-то дойдем до модуля - разрешаем ему отработать и передаем собранные параметры.
 

bgm

 
bools
Вот как это можно решить используя модель "дерево объектов".

URL, к примеру, может показывать вложенность объектов в дереве сайта. Вернее путь к конкретному объекту от корня. И путь может быть виртуальным. Т.е. никак не отражать реальную вложенность объектов. Таким образом, можно сначала попытаться по URL найти конкретный объект по пути в дереве, а если его найти не удалось - искать уже по виртуальному пути.

А тип объекта, модули или что ещё захочется - хранить в дереве.
 

StUV

Rotaredom
Должен? Ничего он никому не должен. Вот например: ( http://www.uaz.ru/partnership/pokyp/ ) - тут урл "однозначно показывает" какой модуль подключён?
разработчику - да
клиента это вообще не волнует
 

Marquis

Новичок
akd
а в обратную это как? :) вернуться так сказать к первоисочнику, PHP-Nuke и иже с ним? :)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Marquis - это понять, что
1. сайты должен делать программист, а не пользователь
2. обычно пользователь в адресе понимает только имя домена

Война с ветряными мельницами - дело хоть и нужное, но неинтересное для обсуждения.
Я с проблемой переноса админского (любого) модуля не сталкиваюсь - просто использую везде относительные пути, размещаю каждый модуль в своей директории. Это позволяет переносить куда угодно что угодно, меняя при этом только адреса ссылок в шаблонах и (при изменении уровня вложенности) - относительный путь к config.php в скриптах.
Даже путь к конфигу скрипт может определить сам - но жаль ресурсы на это тратить.

A eсли админу хочется изменить путь - пусть пропишет mod_rewrite и выучит HTML.
 

kruglov

Новичок
У меня в CMS у страницы чекбоксом прописывается - текст ли она или скрипт (модуль).

И другим чекбоксом - куда пойдет остаток URI после адреса этой страницы - ей или главному handlerу.
 

jonjonson

Охренеть
bools, сколько раз тот же Фанат учил: Напиши всё по русски, что хочешь добиться... Причём полностью!

В данной ситуации: то ты заявляешь, что URL тебе нужен фонарный (придуманный пользователем), то ты пытаешься внести в него какую-то значащую информацию (а пользователь, между тем, её туда не вносил). Так что определись, фонарный тебе нужен URL, или частично фонарный. А если частично фонарный, то определи шаблон для его фонарной части и не фонарной.

И далее... В любом случае явный мапинг контроллера (а не призрачного модуля) лучше неявного (поиск знакомой последовательности символов в URL из имеющегося списка). Пользователь может впихнуть в "фонарный" URL несколько таких последовательностей, а какую он подразумевал как основную, это дело "фонарное" и не всегда может определятся порядком в "фонарной" последовательности. Ибо изначально не была задана степень "фонарности" :)
 

Groove

Новичок
Re: Помогите с решением: ЧПУ в CMS

я такое построил через NestedSets

Почитай тут: http://php.russofile.ru/ru/authors/sql/nestedsets01/

Каждой странице проекта соотвествуют следующие данные:
- кэшированный url вида /news/{NEWS_ID}/
- параметр {NEWS_ID}
- кэшированный regexp вида /news/([0-9]+)/
- regxep ([0-9]+)
- обработчик
- метатэги
- титл, можно с параметрами
- флаг добавлять на карту? (варианты: добавить на карту админки, кабинета пользователя, не добавлять, ...)
- шаблон общий (например в админке один, в кабинете юзера другой, в публичной части третий)
- ...

Как это работает:
есть url /news/123/
входящий урл проверяется запросом на соответствие "кэшированному regexp", если соотвествует, то автоматически определяет константу define('NEWS_ID',123); которая потом используется.
Затем вызывается обработчик. Строятся нужные карты.

В общем в кратце так все, будут вопросы - пиши, отвечу.

Плюсы: автоматическое формирование текущего положения посетителя в боковом меню (карта), навигаторе ("хлебные крошки"), неограниченная вложенность

В твоем случае

/analitika/finansi/Russia/news/2007/08/12/news_name.html

в моей схеме был бы таким:
/analitika/{ANALYST_RUBRIC}/{ANALYST_COUNTRY}/news/{YEAR}/{MONTH}/{DAY}/{NEWS_NAME}.html

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

P.S.: обработчик должен быть просто сборщиком элементарных действий:
- показать список новостей по параметрам
- показать похожие новости по ключевым словам
- ...
 

akd

dive now, work later
Команда форума
Marquis, ответ не для тебя был а для bools.
хотя твои проблемы с названиями, тоже решаются.
 
Сверху