VirtualPage разные контексты (жесткая ссылка?)
Здравствуйте!
Дано:
2 контекста, web и en
Маршрут:
По ссылке: sitename.ru/en/item/55/ обработчик почему-то берет контекст `web`.
Пытался сделать иначе:
1. Маршрут:
То есть по ссылке sitename.ru/en/item/55/ берется контекст web
Каким образом возможно поменять контекст?
Быть может указав в маршруте жесткую ссылку?
Как-то так: //sitename.ru/item/{item_id:[0-9]+}/?
Однако, так не работает. Может быть я что-то упустил?
Дано:
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]+}/?
Однако, так не работает. Может быть я что-то упустил?
Комментарии: 22
да а с какой радости оно должно переключать контекст?
и что у вас в чанке router? И блин в чанкеее…
Конечно ничего не будет работать…
и что у вас в чанке router? И блин в чанкеее…
Конечно ничего не будет работать…
Если будут обрабатываться разные маршруты, разными обработчиками.
Похоже, что самый простой вариант, добавить маршрут:
/item/{item_id:[0-9]+}/en/
И привязать к обработчику:
Правда ссылка будет:
sitename.ru/en/item/1267/en/
Хотя будет прекрасно работать и с:
sitename.ru/item/1267/en/ Только это ни к чему.
Впрочем, костыль готов. :)
Похоже, что самый простой вариант, добавить маршрут:
/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/ Только это ни к чему.
Впрочем, костыль готов. :)
а что мешает пользовать например такой маршрут?
/{key}/item/{item_id:[0-9]+}/
и в обработчике[[!wiki-router?
&context=`[[+vp.key]]`
&item_id=`[[+vp.item_id]]`
]]
Работает, но весьма странно:
Допустим, ссылка:
sitename.ru/en/item/1267/
получаем ошибку 404 (у меня 503 т.к. не задал страницу в данном контексте)
Если добавим еще один /en/:
sitename.ru/en/en/item/1267/
То все работает.
Получается, что нужно что-то мудрить с base_url?
Допустим, ссылка:
sitename.ru/en/item/1267/
получаем ошибку 404 (у меня 503 т.к. не задал страницу в данном контексте)
Если добавим еще один /en/:
sitename.ru/en/en/item/1267/
То все работает.
Получается, что нужно что-то мудрить с base_url?
начните с того, какая у вас настройка base_url в контекстах…
base_url для web = / — (странно, что ссылка sitename.ru/item/1267/ при этом работает)
base_url для en = /en/
Согласно инструкции.
И каша в голове. Похоже, единственное что работает, это костыль. :\
base_url для en = /en/
Согласно инструкции.
И каша в голове. Похоже, единственное что работает, это костыль. :\
разберитесь с кашей.
Что у вас тут — wiki-router?
вам по сути надо всего то перегрузить контекст…
что то типа
Что у вас тут — wiki-router?
вам по сути надо всего то перегрузить контекст…
что то типа
$key = $_REQUEST['fastrouter']['key'];
if ($modx->getCount('modContext', $key)) {
$modx->switchContext($key);
}
wiki-router — это синоним router, просто старое название.
Ищет предмет в базе по id.
Спасибо за код, я делал так:
Теперь, благодаря вам, так:
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
Ищет предмет в базе по 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
проверяйте свой код, плагины и тд…
То есть такой подход 100% рабочий?
Может ли каким-то образом препятствовать Apache?
Слышал, что Modx лучше работает на nginx
Слышал, что Modx лучше работает на nginx
И выбираете вы по id что? Ресурс? Так у вас в разных контекстах разные же id… Вообще не очень понятно что вы хотите сделать…
Спасибо что заметили, делал очень давно и оказалось что в чанке у меня был вызов сниппета:
[[*context_key]] ведь возвращается такой, в каком контексте расположена страница? Получается, что VirtualPage как виртуальный не может находиться где-либо, и берется значение прописанное в скриптах VirtualPage по умолчанию?
item_id — id строки игрового предмета из общей базы. Из которой я беру столбцы name_web, name_en и так далее, в зависимости от ключа контекста, и вывожу данные о предмете.
[[!router?
&context=`[[*context_key]]`
&item_id=`[[+vp.item_id]]`
]]
:facepalm:[[*context_key]] ведь возвращается такой, в каком контексте расположена страница? Получается, что VirtualPage как виртуальный не может находиться где-либо, и берется значение прописанное в скриптах VirtualPage по умолчанию?
item_id — id строки игрового предмета из общей базы. Из которой я беру столбцы name_web, name_en и так далее, в зависимости от ключа контекста, и вывожу данные о предмете.
то-есть id одинаковый для всех контекстов — это всего лишь номер строки предмета в базе.
И все-же /{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, когда включен, обработчик срабатывает.
Судя по всему, в контексте en, по ссылке sitename.ru/en/item/123123/ vp анализирует только то, что находится после sitename.ru/en/. Это становится ясно, включая/выключая маршрут /item/{item_id:[0-9]+}/.
Когда последний отключен, modx выдает 404, когда включен, обработчик срабатывает.
Заменил [[*context_key]] на [[++culture_key]], и понял, что второе берется как надо.
Поэтому, создал свой ключ в каждом из контекстов, в котором прописано значение, которое нужно для корректной выборки из базы.
Маршрут остался первоначальным:
[[!mysnippet?
&context=`[[++myname]]`
&item_id=`[[+vp.item_id]]`
]]
Правда пришлось отключить кеширование.
Про настройки pdoMenu спасибо, надо поковырять.
Поэтому, создал свой ключ в каждом из контекстов, в котором прописано значение, которое нужно для корректной выборки из базы.
Маршрут остался первоначальным:
/item/{item_id:[0-9]+}/
Обработчик тоже почти не изменился:[[!mysnippet?
&context=`[[++myname]]`
&item_id=`[[+vp.item_id]]`
]]
Правда пришлось отключить кеширование.
Про настройки pdoMenu спасибо, надо поковырять.
По всей видимости дело не в настройках, а в переключении контекста.
Как и говорили выше.
Как и говорили выше.
$modx->switchContext('en');
$modx->setOption('cultureKey','en');
Не работает. Быть может потому, что сниппет выводит чанк только со значениями из базы?Странно все это.
Ссылки внутри чанка сами собой с /en/, в то время как ссылки вне чанка без /en/.
У меня есть предположение, что контекст не переключается плагином bezumkun'a потому, что в первую очередь событие OnHandleResources отрабатывает VirtualPage, и только затем плагин мультиязычности.
Быть может нужно как-то отследить событие инициализации VP, что бы это событие можно было повесить на плагин мультиязычности?
Быть может нужно как-то отследить событие инициализации VP, что бы это событие можно было повесить на плагин мультиязычности?
Короче, создал 2 маршрута, которые отличаются на одну букву /items/… и /item/…
И повесил ресурсы с каждого из контекстов на них обработчиками. Все работает.
И повесил ресурсы с каждого из контекстов на них обработчиками. Все работает.
Это костыль невиданных размеров…
Кому еще актуально:
\virtualpage\model\virtualpage\virtualpage.class.php
строка 361 заменить на
\virtualpage\model\virtualpage\virtualpage.class.php
строка 361 заменить на
return 'https://'.$_SERVER['SERVER_NAME'].'/'.$uri;
Тогда можно маршруты прописывать полным адресом, включая поддомены. Привязка будет жесткой
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.