Своеобразное ЧПУ

Статус
В этой теме нельзя размещать новые ответы.

stanlee

Новичок
Своеобразное ЧПУ

Решил улучшить возможности модулей
в связи с этим возникла проблема
путь я храню в бд типо /about/company/
и по нему нахожу нужный id раздела при парсинге строки

но вот какая проблемка
допустим я подключаю модули в раздел /about/company/
допустим фотогалерею у которой есть свои разделы
типо /life/, /birthday/days/ и тд

при серфинге в идеале долно получиться /about/company/life/ или /about/company/birthday/days/
но никак не могу придумать как научить скрипт разделять пути разделов и пути модулей и чтобы все было едино

может кто то такое реализовывал
подскажите пожалуйста
 

stanlee

Новичок
У них простая реализация и неудобная
у меня было почти похожее до этого

дело все в том что они используют схему
контроллер/действие/переменная1/значение1/переменная2/значение2.

где посути контроллер состоит из 1 слова
это не есть хорошо
тк чпу на то и задумывался чтобы дать человеку читаемый урл
а что лучше
/company/
или
/about/company/
по мне так второе - тк виден путь и уже представление где вы находитесь
а если будет 1 слово и вы уйдете на 10 уровней вглубь?

в тех же операционных системах что у вас на компьютерах вы заблудитесь быстро

задача очень простая и в тоже время сложная (

я виел что то подобное когда путь разбивали знаком ? или .
что то вроде
/yca/cat/?/entertainment/videohosting/
или
/yca/cat/./entertainment/videohosting/

но как то эстетика портится )
 

HraKK

Мудак
Команда форума
chain routing(c) Я
Разбиваешь урл по делимитеру, и роутер смотрит что делать с первой частью куда отдавать, принял решение - какому модулному контроллеу отдвать, отдал обработал и своему роутеру передается следуйщий акшен тот думает что делть с ним и так дальше

/about/company/life/

/about/ - front router отдает в page controller
тот обработал например добавил в навигацию путь,
смотрит дальше - company - какой-то свой company controller,у которого роутер запрашивает параметр /life/
и дальше не передает управление.
 

MiksIr

miksir@home:~$
а никак не разделять.
Сортированный по длине (от большего к меньшему) список узлов и последовательное сравнение в цикле (совпадение начала урла и строчки из узла) с выходом из цикла при совпадении.
При небольшом количестве узлов - оптимально. При очень большом можно морочиться и строчить свое b-tree.
 

stanlee

Новичок
HraKK думаю так оч ресурсоемко будет
уж лучше я тогда точку введу )

проще канечно модреврайтом обойти
но не хочется тк процесс управления усложняется
 

Ярослав

Новичок
stanlee
это почему? есть тесты?
Как по мне вариант HraKK отлично подходит в данной ситуации.
 

beejuice

Новичок
Решал подобную задачу с использованием массива сравнения.

URL разбиваю в массив и сравниваю каждый его элемент с другим массивом в котором лежат названия "конечных" разделов.

Например у вас путь company/news/archive/2006/

В массиве сравнения лежит "news". Разборщик начиная с этого места все данные начинает складывать в $_GET или еще куда-нибудь.

В итоге получается имя обработчика "news" и данные к нему:
archive и 2006
 

stanlee

Новичок
какая разница "если" или "или"
подход же должен быть максимально универсальным и производительным
походу моя нынешняя структура так и останется (
 

zerkms

TDD infected
Команда форума
подход же должен быть максимально универсальным и производительным
не должен. программисты решают реальные задачи, которые перед ними могут встать, а философия это в соседнем здании.

stanlee
моя нынешняя структура
при том, что разговор в топике идёт про ЧПУ, а твой подход - это просто замена ?a=b на a/b, и ровно точно такая же никакая не ЧПУшность
 

stanlee

Новичок
zerkms читай первый пост
путь я храню в бд типо /about/company/
и по нему нахожу нужный id раздела при парсинге строки
мне нужно максимально производительный вариант
это моя первостепенная задача а не философия
пусть там кто то решает задачи а потом удивляется откуда тормоза
а я рассчитываю всегда с условием высоких нагрузок
может их ине будет но пусть будет
 

zerkms

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

MiksIr

miksir@home:~$
Например, если имеем дерево сайта, то оно не может быть большим. Иначе это будет не сайт, а херня какая-то. При этом нам нужно построить меню, построить хлебные крошки... часто оказывается, что проще взять все дерево одним запросом и по нему строить (возможно где-то закешировав), чем размножать запросы в базу.
А бывают и другие ситуации. Если не жалко запросы в базу плодить, то пожалуйста, берешь урл, и запрашиваешь сначала /yca/, потом /yca/cat/, потом /yca/cat/entertainment/ и т.д... как только ничего не найдено - твой узел последний. Но это писец ;)

-~{}~ 25.07.08 12:32:

а я рассчитываю всегда с условием высоких нагрузок
тогда все дерево храни в кеше... кеш то есть, конечно?

-~{}~ 25.07.08 12:35:

Впрочем, можешь делать и /yca/cat/?/entertainment/videohosting/... никому хуже от этого точно не будет, а жить проще ;)
 

stanlee

Новичок
zerkms где я кого учил?
я ващето за советом сюда пришел
какой то бред несешь вообще

MiksIr ну деревья бывают разные
а вдруг это каталог аля yca там разделов несколько тысяч
а с выборкой проблем нет
я храню все в nested sets немного переделанной
там и запись и выборка у меня моментальные

Впрочем, можешь делать и /yca/cat/?/entertainment/videohosting/... никому хуже от этого точно не будет, а жить проще
если ничего не получится то буду наверное так
просто хотелось немного эстетики )
 

MiksIr

miksir@home:~$
а если каталог, то нет необходимости одному разделу назначать путь со слешами
 

stanlee

Новичок
MiksIr у меня не каталог а цмска
и ей должно быть пофиолету что не ней делается )
поэтому и ищу универсальное и высокопроизводительное решение
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху