Красивое получение параметра из URL

Главные вкладки

Аватар пользователя keno keno 22 октября 2007 в 16:24

Добрый день, помогите советом. пожалуйста Wink

Продвигаюсь в направлении указанным здесь: http://www.drupal.ru/node/6122
Т.е. имею свой тип контента (example), имеем свой дизайн ноды и страницы. Адрес, по которому это располагается выглядит примерно так:

site.com/example/23

В ноду забит контент, однако есть необходимость динамически строить некоторые вещи. Т.е. необходимо иметь адрес site.com/example/23/id где id — параметр в зависимости от которого будут строится вещи. Вопрос, как красиво получить этот параметр и чтобы друпал не обращался при этом к несуществующей ноде site.com/example/23/id

Урл хочется чистый, это строго.

Комментарии

Аватар пользователя keno keno 22 октября 2007 в 18:20

mod_rewite это очевидно, но не очень хочется по следуюшей причине

В идеале должно получится так (список страниц):

site.com/toys/23/ — тип контента "статья"
site.com/toys/100/ — тип контента "статья"
site.com/toys/unique-name/ — тип контента "статья"
site.com/toys/178/ — тип контента "example", принимает id по дефолту (0)
site.com/toys/178/5 — тип контента "example", принимаем id = 5.

ну и кроме toys (что определена как term в таксономии) будут и другие. Таким образом все страницы относятся к какому то типу и могут иметь один из нескольких типов, некоторые из которых (типов) нуждаются в своей хитрой обработке контента.

Т.е. видится такой алгоритм

1) перед выводом ноды проверяем её тип
2) если тип НЕ example — всё идёт как обычно
3) если тип example то определяем id и в контент добавляем результат, который достаём из БД по данному ID. Примерно так.

Ну и естествено проблема, что надо предотвратить ошибку по адресу site.com/toys/178/5 (ноды то там нет).

К сожалению не знаю еще друпал до такой степени, чтобы сходу придумать, как это реализовать.

Ну и в дополнение к идеалу можно добавить, что такие особенные типы данных будут добавляться иногда, т.е. желательно сосредоточить управление в админке.

Аватар пользователя Stalker-g2 Stalker-g2 22 октября 2007 в 18:34

вы если честно малость фантазёр. mod_rewrite и только он.
вы вообще не представляете себе механизма передачи параметров.

Аватар пользователя keno keno 22 октября 2007 в 18:57

Мне кажется вы меня недопоняли.

site.com/toys/178/ — тип контента "example", принимает id по дефолту (0)
site.com/toys/178/5 — тип контента "example", принимаем id = 5.
site.com/toys/178/subcat1 — тип контента "статья", ничего не делаем

site.com/toys/178/subcat2 — тип контента опять "example", id = 0
site.com/toys/178/subcat2/100 — тип контента опять "example", id = 100

Т.е. весь смысл этой штуки в том, что все отличия одной страницы от другой прописаны внутри системы и не может быть никакого общего правила, чтобы по URL определять, надо брать id или нет. Разумеется я понимаю, что я могу взять и распарсить $_REQUEST['q'] и достать оттуда всё что надо, но камень преткновения тут в двух моментах:

1) если просто добавить /100 , то друпал скажет, что такой ноды нет и будет прав. Визуальный изврат в виде /?id=100 мне не нужен
2) по внешному виду URL не определить есть там ID или нет. Это можно определить, только зная тип контента, который выбрал редактор.

Вы меня хотите уверить, что разумно писать правила mod_rewrite для всех конкрентных случаев?.. Боюсь вы меня не поняли. mod_rewrite я представляю хорошо, я Друпал представляю плохо, вот поэтому и спрашиваю здесь Wink

И вопрос не в том, КАК достать ид, а в том, где "хукнуть", чтобы не было 1) и где "хукнуть", чтобы добавить к контенту некий результат function(id)

Аватар пользователя Stalker-g2 Stalker-g2 22 октября 2007 в 19:29

2) по внешному виду URL не определить есть там ID или нет. Это можно определить, только зная тип контента, который выбрал редактор.
да что вы говорите?
а вы о регулярных выражениях слышали?

Берём два правила
RewriteRule index.php?path=$1&id=$2 (.*)/id(.*)
RewriteRule index.php?path=$1 (.*)

Они более чем прекрасно опишгут ситуацию(естественно, под друпал и под 100% валидность они не подогнаны):
site.com/toys/178/ — тип контента "example", принимает id по дефолту (0)
site.com/toys/178/id5 — тип контента "example", принимаем id = 5.
site.com/toys/178/subcat1 — тип контента "статья", ничего не делаем

site.com/toys/178/subcat2 — тип контента опять "example", id = 0
site.com/toys/178/subcat2/id100 — тип контента опять "example", id = 100

Аватар пользователя Stalker-g2 Stalker-g2 22 октября 2007 в 19:31

Т.е. весь смысл этой штуки в том, что все отличия одной страницы от другой прописаны внутри системы
уж не знаю, что вы тут имели ввиду-больно непонятно пишете, но может быть вам и не надо передавать Id через урл,а достаточно зарегистрировать его в сессиях через $_SESSION['id']?

Аватар пользователя keno keno 22 октября 2007 в 19:43

Вы нарушаете условия задачи: пишите site.com/toys/178/id5 . Мне не нужно никаких приписок и префиксов id перед его значением. Почему так -- это не в условиях задачи, но надо строго.

не надо: site.com/toys/178/id5
надо site.com/toys/178/5

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

PS: может я вас обрадую, но про регулярные выражения я слышал.

Ну и в финале -- передавать Id всё-таки надо, он приходит "со стороны", т.е. является частью адреса, по которому пользователь приходит на сайт.

Аватар пользователя Stalker-g2 Stalker-g2 22 октября 2007 в 19:49

Вы нарушаете условия задачи: пишите site.com/toys/178/id5 . Мне не нужно никаких приписок и префиксов id перед его значением. Почему так -- это не в условиях задачи, но надо строго.
а вам задачу решить надо или фичу внедрить?

если задачу решить-так идите патчить ядро. это да, куда более правильно,чем лишнее правило в хтаццесс написать. Вам прямая дорого в Index.php и смотрите,куда там q идёт. вставляйте в нужном месте свой код. Получите отличное решение + полкило гиммороя при обновлениях.

Аватар пользователя keno keno 22 октября 2007 в 19:55

Спасибо за предложеный вариант, но наличие/отсутствие префикса здесь не вопрос эстетики, а реально требуемое условие.

Народ, еще какие то варианты есть?

Аватар пользователя staryi@drupal.org staryi@drupal.org 24 сентября 2009 в 6:06

Хостер продолжает настаивать что у него все в порядке ((
Но блин ситация не улучшается, попробовал уже поменять тему, отключить блоки отображаемые только на главной, результат тот же. Главная вылетает в ошибку 404 без каких либо на то причин, и сама восстанавливает работаспособность когда ей захочеться (((

Что еще можно попробовать потрибушаить чтоб найти причину ?