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
2
902
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;
      Тогда можно маршруты прописывать полным адресом, включая поддомены. Привязка будет жесткой
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.