1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - коммерческий форумный движок от бывших создателей vBulletin, написанный на PHP.

Помогите с роутированием

Тема в разделе "Вопросы и ответы по XenForo Framework", создана пользователем Денис Абраменко, 21.05.2014.

Загрузка
  1. Денис Абраменко

    Денис Абраменко Местный

    Регистрация:
    21.11.10
    Сообщения:
    14
    Симпатии:
    4
    Доброго времени суток! Возникла проблема с роутированием, которую не могу решить. Хочу создать страницы вида catalogue/pens/10, где catalogue - префикс дополнения, pens - название раздела, а 10 - индификатор записи. Хочу передать в контроллер название раздела и идентификатор записи.

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

    Заранее благодарен.
     
  2. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Роутинг только для префикса (prefix). Затем идет элемент, а за ним экшены (action). Причем экшенов может быть много. Так вот префикс определяется в Route/Prefix, а обрабатываемый контроллер - в режиме разработки в админке в префиксах роутинга. В самом контроллере уже описываются экшены в виде actionOneTwoThreeFour ну и так далее. При этом путь формируется в виде prefix/element.number/one/two/three/four. Для формирования ссылки конкретного элемента в описываемом префиксе используется метод buildLink в своем префиксе. Для того, чтобы номер элемента вынести в конец, нужно будет в фильтрах роутинга прописать свое правило. Ну вот как-то так.
     
    Mirovinger и Денис Абраменко нравится это.
  3. Денис Абраменко

    Денис Абраменко Местный

    Регистрация:
    21.11.10
    Сообщения:
    14
    Симпатии:
    4
    Спасибо за ответ. Сегодня решил проблему. Я не знал, что класс Zend_Controller_Request_Http имеет метод setParam. Случайно обнаружил его, когда смотрел описания метода resolveActionWithIntegerParam, и сразу понял что к чему.
     
  4. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    А каким образом Вы используете setParam? Он по идее нужен, когда требуется задать параметр при responseReroute.
     
  5. Денис Абраменко

    Денис Абраменко Местный

    Регистрация:
    21.11.10
    Сообщения:
    14
    Симпатии:
    4
    Вот весь класс http://pastebin.com/40e5H33C
    В 36 и 37 строчках присваиваю через setParam нужные параметры. Решение кажется каким-то ненормальным, но я пока нельзя пекусь на этот счет. Работает, ну и ладно.
     
  6. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Ну да. Как-то странно в роутинге устанавливать параметры запроса. Как-то логичнее это делать в контроллере, в котором в случае отсутствия параметра банально устанавливать параметр и вызывать responseReroute, либо при наличии параметра обрабатывать его далее в экшене. По такому принципу работает тот же экшен actionIndex в ControllerPublic/Member.php. Только там не устанавливается параметр, а сразу рероут идет. Я в своем плагине перед рероутом устанавливаю параметр. Тогда сохраняется прозрачная логика работы. Да и постоянно дергающийся метод match в префиксе роутинга не будет перегружен лишней обработкой, да еще и с запросами. С точки зрения производительности все же лучше вынести всю обработку в контроллер. ИМХО, конечно же.
     
  7. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Насчет роутинга - хардкорно зашит только префикс роутинга (первая часть), т.е. "catalogue" из "catalogue/pens/10"
    а дальше ("/pens/10") разбираете как посчитаете нужным в классе роут префикса. Там 2 метода: один для генерации ссылки из данных и второй для разбора урла и передачи правильных параметров в правильный контроллер/экшн. Просто по умолчанию есть куча готовых методов для разбора урл-ов по типу урл-ов используемых в ксене, но если нужно что-то свое то никто не мешает это свое сделать. Кстати урл в примере можно разобрать с помощью стандартных методов. Но все равно остается куча нюансов - будет пагинация или нет и т.д.
    Т.к. не сказано на какой action должен идти вызов будет считать что index

    PHP:
    //catalogue/pens/10
    //разбираем путь ($id = 10, параметр request-а node_name = 'pens'
    $id $router->resolveActionWithStringParam($routePath$request'node_name');
    //параметр request-а node_name = 'pens'
    $request->setParam('item_id'$id);

    return 
    $router->getRouteMatch('MyAddOn_ControllerPublic_Catalogue''index''catalogue');

    P.S. Технически можно и до роут префикса разгребать, но в 99% случаев это не нужно.
    --- добавлено : May 23, 2014 10:34 AM ---
    Ну вообще-то как раз роутинге и надо установить все параметры запроса полученные из SEO- френдли строки запроса. И именно так и делается в ксенфоро повсеместно, а установка переменных request-а в контроллере больше исключение и нужно только для случаев рероутинга в контроллерах.
     
    Последнее редактирование модератором: 31.05.2014
    Mirovinger нравится это.
  8. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Конечно все зависит от использования. Но последним указание номер элемента проще все же через фильтр сделать, чем писать свой код обработки. На любителя :)
     
  9. Денис Абраменко

    Денис Абраменко Местный

    Регистрация:
    21.11.10
    Сообщения:
    14
    Симпатии:
    4
    Пагинация будет. Я решил разбирать строку самому.
    --- добавлено : 23 май 2014 в 15:20 ---
    Тут Вы не правы. Параметры нужно устанавливать в роутинге. В XenForo_ControllerPublic_Member случай совсем другой
     
    Последнее редактирование модератором: 31.05.2014
  10. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Вообще-то я об этом и написал. Или ответ на сообщение @infis ?
     
  11. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Я не знаю конкретно Вашей реализации. В моем случае установка параметра была вынужденная. При этом установить этот параметр потребовалось в контроллере перед рероутом.

    А относительно где и как нужно - примерно в половине случаев параметры в ксене устанавливаются в контроллерах (кстати, не только для рероута), а в половине - в префиксах.

    И вообще вы оба правы и не правы. Просто все зависит от того, с какой стороны смотреть. Если что, я доказывать ничего не собираюсь, просто высказал свое мнение. Да и тема, вроде как, исчерпана. Не? ;)
     
    Последнее редактирование модератором: 31.05.2014
  12. Денис Абраменко

    Денис Абраменко Местный

    Регистрация:
    21.11.10
    Сообщения:
    14
    Симпатии:
    4
    Ответ к @infis
    --- добавлено : 23 май 2014 в 18:41 ---
    Безусловно. Дальше спорить нет смысла, у каждого из нас свои реализации
     
    Последнее редактирование модератором: 31.05.2014

Поделиться этой страницей