VirtualPage разные контексты (жесткая ссылка?)

Здравствуйте!
Дано:
2 контекста, web и en
Маршрут:
/item/{item_id:[0-9]+}/
Обработчик:
[[!$router?
 &context=`[[*context_key]]`
 &item_id=`[[+vp.item_id]]`
]]
По ссылке: sitename.ru/item/55/ отрабатывает как положено.
По ссылке: sitename.ru/en/item/55/ обработчик почему-то берет контекст `web`.

Пытался сделать иначе:
1. Маршрут:
/item/{item_id:[0-9]+}/
1. Обработчик:
[[!$router?
 &context=`web`
 &item_id=`[[+vp.item_id]]`
]]
2. Маршрут:
/en/item/{item_id:[0-9]+}/
2. Обработчик:
[[!$router?
 &context=`en`
 &item_id=`[[+vp.item_id]]`
]]
Однако, в любом случае обрабатывается только первый маршрут.
То есть по ссылке sitename.ru/en/item/55/ берется контекст web

Каким образом возможно поменять контекст?
Быть может указав в маршруте жесткую ссылку?
Как-то так: //sitename.ru/item/{item_id:[0-9]+}/?
Однако, так не работает. Может быть я что-то упустил?
Дмитрий
27 июня 2015, 05:13
modx.pro
2
976
0

Комментарии: 22

Володя
27 июня 2015, 09:35
+1
да а с какой радости оно должно переключать контекст?
и что у вас в чанке router? И блин в чанкеее
Конечно ничего не будет работать…
    Дмитрий
    27 июня 2015, 11:08
    0
    Если будут обрабатываться разные маршруты, разными обработчиками.

    Похоже, что самый простой вариант, добавить маршрут:
    /item/{item_id:[0-9]+}/en/

    И привязать к обработчику:
    [[!wiki-router?
     &context=`en`
     &item_id=`[[+vp.item_id]]`
    ]]
    Так — работает.
    Правда ссылка будет:
    sitename.ru/en/item/1267/en/

    Хотя будет прекрасно работать и с:
    sitename.ru/item/1267/en/ Только это ни к чему.
    Впрочем, костыль готов. :)
      Володя
      27 июня 2015, 11:23
      +1
      а что мешает пользовать например такой маршрут?
      /{key}/item/{item_id:[0-9]+}/
      и в обработчике
      [[!wiki-router?
       &context=`[[+vp.key]]`
       &item_id=`[[+vp.item_id]]`
      ]]
        Дмитрий
        27 июня 2015, 11:48
        0
        Работает, но весьма странно:
        Допустим, ссылка:
        sitename.ru/en/item/1267/
        получаем ошибку 404 (у меня 503 т.к. не задал страницу в данном контексте)

        Если добавим еще один /en/:
        sitename.ru/en/en/item/1267/

        То все работает.
        Получается, что нужно что-то мудрить с base_url?
          Володя
          27 июня 2015, 11:59
          +1
          начните с того, какая у вас настройка base_url в контекстах…
            Дмитрий
            27 июня 2015, 12:33
            0
            base_url для web = / — (странно, что ссылка sitename.ru/item/1267/ при этом работает)
            base_url для en = /en/
            Согласно инструкции.

            И каша в голове. Похоже, единственное что работает, это костыль. :\
              Володя
              27 июня 2015, 14:48
              +1
              разберитесь с кашей.
              Что у вас тут — wiki-router?
              вам по сути надо всего то перегрузить контекст…
              что то типа
              $key = $_REQUEST['fastrouter']['key'];
              if ($modx->getCount('modContext', $key)) {
                  $modx->switchContext($key);  
              }
                Дмитрий
                27 июня 2015, 15:10
                0
                wiki-router — это синоним router, просто старое название.
                Ищет предмет в базе по id.

                Спасибо за код, я делал так:
                switch($context){
                 case 'en':
                  $context = 'en';
                  break;
                 default:
                  $context = 'web';
                  break;
                }
                Что по сути только меняло переменную, чтобы можно было вытащить английское название.

                Теперь, благодаря вам, так:
                $key = $_REQUEST['fastrouter']['context_key'];
                if ($modx->getCount('modContext', $key)) {
                    $modx->switchContext($key);  
                }
                $context = $modx->context->key;
                Однако, по прежнему, VP не понимает ссылку:
                sitename.ru/en/item/4/
                В контексте /en/ работает только так:
                sitename.ru/en/en/item/4/

                1. Боюсь, что поменяв в настройках контекста site_url либо base_url, появятся проблемы с мультиязычностью.
                2. Появляется еще одна проблема, VP не знает что контекст изменился, поэтому в меню генерируются ссылки вида:
                sitename.ru/index.html
                вместо:
                sitename.ru/en/index.html
                Меню собирается при помощи pdoMenu
                  Володя
                  27 июня 2015, 15:33
                  -1
                  проверяйте свой код, плагины и тд…
          Дмитрий
          14 июля 2015, 13:08
          0
          То есть такой подход 100% рабочий?
            Дмитрий
            14 июля 2015, 14:14
            0
            Может ли каким-то образом препятствовать Apache?
            Слышал, что Modx лучше работает на nginx
        Володя
        27 июня 2015, 09:54
        +1
        И выбираете вы по id что? Ресурс? Так у вас в разных контекстах разные же id… Вообще не очень понятно что вы хотите сделать…
          Дмитрий
          27 июня 2015, 10:57
          0
          Спасибо что заметили, делал очень давно и оказалось что в чанке у меня был вызов сниппета:
          [[!router?
            &context=`[[*context_key]]`
            &item_id=`[[+vp.item_id]]`
          ]]
          :facepalm:

          [[*context_key]] ведь возвращается такой, в каком контексте расположена страница? Получается, что VirtualPage как виртуальный не может находиться где-либо, и берется значение прописанное в скриптах VirtualPage по умолчанию?

          item_id — id строки игрового предмета из общей базы. Из которой я беру столбцы name_web, name_en и так далее, в зависимости от ключа контекста, и вывожу данные о предмете.
            Дмитрий
            14 июля 2015, 14:16
            0
            то-есть id одинаковый для всех контекстов — это всего лишь номер строки предмета в базе.
            Дмитрий
            27 июня 2015, 16:28
            0
            И все-же /{key}/item/{item_id:[0-9]+}/ не вариант, и даже /{key:[a-z]+}/item/{item_id:[0-9]+}/

            Судя по всему, в контексте en, по ссылке sitename.ru/en/item/123123/ vp анализирует только то, что находится после sitename.ru/en/. Это становится ясно, включая/выключая маршрут /item/{item_id:[0-9]+}/.

            Когда последний отключен, modx выдает 404, когда включен, обработчик срабатывает.
              Дмитрий
              27 июня 2015, 16:51
              0
              Заменил [[*context_key]] на [[++culture_key]], и понял, что второе берется как надо.
              Поэтому, создал свой ключ в каждом из контекстов, в котором прописано значение, которое нужно для корректной выборки из базы.

              Маршрут остался первоначальным:
              /item/{item_id:[0-9]+}/
              Обработчик тоже почти не изменился:
              [[!mysnippet?
              &context=`[[++myname]]`
              &item_id=`[[+vp.item_id]]`
              ]]
              Правда пришлось отключить кеширование.

              Про настройки pdoMenu спасибо, надо поковырять.
                Дмитрий
                27 июня 2015, 17:41
                0
                По всей видимости дело не в настройках, а в переключении контекста.
                Как и говорили выше.
                Дмитрий
                27 июня 2015, 17:55
                0
                $modx->switchContext('en');
                $modx->setOption('cultureKey','en');
                Не работает. Быть может потому, что сниппет выводит чанк только со значениями из базы?
                Странно все это.

                Ссылки внутри чанка сами собой с /en/, в то время как ссылки вне чанка без /en/.
                  Дмитрий
                  27 июня 2015, 18:10
                  0
                  У меня есть предположение, что контекст не переключается плагином bezumkun'a потому, что в первую очередь событие OnHandleResources отрабатывает VirtualPage, и только затем плагин мультиязычности.

                  Быть может нужно как-то отследить событие инициализации VP, что бы это событие можно было повесить на плагин мультиязычности?
                  Дмитрий
                  27 июня 2015, 19:09
                  0
                  Короче, создал 2 маршрута, которые отличаются на одну букву /items/… и /item/…
                  И повесил ресурсы с каждого из контекстов на них обработчиками. Все работает.
                    Дмитрий
                    14 июля 2015, 13:08
                    0
                    Это костыль невиданных размеров…
                      Кирилл
                      22 мая 2019, 17:34
                      0
                      Кому еще актуально:
                      \virtualpage\model\virtualpage\virtualpage.class.php
                      строка 361 заменить на
                      return 'https://'.$_SERVER['SERVER_NAME'].'/'.$uri;
                      Тогда можно маршруты прописывать полным адресом, включая поддомены. Привязка будет жесткой
                    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                    22