Формирование URL в MODx Revo
Добрый день уважаемое сообщество!
Подскажите пожалуйста такой вопрос — как формируются ссылки в MODx?
Т.е. задача, нужно сформировать ссылку в адресной строке, когда человек пришел с поисковой системы. Как это сделать именно в момент загрузки страницы? Чтобы ссылка формировалась вида — site.ru/catalog/product.html?&par1=val1&par2=val2 и т.д.
Натолкните на мысли пожалуйста!
Заранее спасибо!
Подскажите пожалуйста такой вопрос — как формируются ссылки в MODx?
Т.е. задача, нужно сформировать ссылку в адресной строке, когда человек пришел с поисковой системы. Как это сделать именно в момент загрузки страницы? Чтобы ссылка формировалась вида — site.ru/catalog/product.html?&par1=val1&par2=val2 и т.д.
Натолкните на мысли пожалуйста!
Заранее спасибо!
Комментарии: 16
[[~123? &par1=`val1` &par2=`val2`]]
Спасибо за ответ. Это не то, что надо. Этот способ я прекрасно знаю для формирования URL для ресурса.
Интересует другое. В момент загрузки страницы нужно перехватить текущий URL, и дописать в конец нужные мне параметры. Т.е. как именно перехватить URL? Смотрю в сторону плагина с событием OnHandleRequest. Не до конца понимаю, что означает это событие, но мне кажется должно подойти. Смотрел в других примерах, например как сформировать фроинд урл из GET параметров, там как раз плагин вешается на это событие.
Буду благодарен, если кто то подскажет про это точнее.
Интересует другое. В момент загрузки страницы нужно перехватить текущий URL, и дописать в конец нужные мне параметры. Т.е. как именно перехватить URL? Смотрю в сторону плагина с событием OnHandleRequest. Не до конца понимаю, что означает это событие, но мне кажется должно подойти. Смотрел в других примерах, например как сформировать фроинд урл из GET параметров, там как раз плагин вешается на это событие.
Буду благодарен, если кто то подскажет про это точнее.
Через плагины, вешаете вроде на OnLoadWebDocument
Спасибо, попробую!
А есть возможность то обратно в строку браузера запихать этот исправленный $url?
А есть возможность то обратно в строку браузера запихать этот исправленный $url?
Вот функция для определения текущего URL:
[correctMode = true] url формируется на основе текущего ресурса по правилам modx — «устойчивый» вариант
[correctMode = false] url формируется из строки запроса
[correctMode = true] url формируется на основе текущего ресурса по правилам modx — «устойчивый» вариант
[correctMode = false] url формируется из строки запроса
function func_getCurrentURL($correctMode = false) {
global $modx; $url = '';
if($correctMode) {
static $urlCorrectMode; if(!isset($urlCorrectMode)) {
$resourceId = $modx->resource->get('id');
$context = $modx->resource->get('context_key');
$parameters = $modx->request->getParameters();
$urlCorrectMode = $modx->makeUrl($resourceId, $context, $parameters, 'full');
$urlCorrectMode = htmlspecialchars_decode($urlCorrectMode);
}
$url = $urlCorrectMode;
} else {
static $urlFast; if(!isset($urlFast)) {
$defaultPort = 80; // порт по-умолчанию
$schemeDelimiter = '://';
// Схема
if(((string)func_getArrayValue($_SERVER, 'HTTPS', '')) === 'on') { // защищённый режим
$urlFast .= 'https'.$schemeDelimiter;
$defaultPort = 443;
} else {
$urlFast .= 'http'.$schemeDelimiter;
}
// Имя сервера
$urlFast .= $_SERVER['SERVER_NAME'];
// Порт
if((int)func_getArrayValue($_SERVER, 'SERVER_PORT', -1) !== $defaultPort) {
$urlFast .= ':'.$_SERVER['SERVER_PORT'];
}
// Путь и параметры
if(array_key_exists('REQUEST_URI', $_SERVER)) {
$urlFast .= $_SERVER['REQUEST_URI'];
} else {
if (array_key_exists('QUERY_STRING', $_SERVER)) {
$urlFast .= $_SERVER['SCRIPT_NAME'].'?'.$_SERVER['QUERY_STRING'];
} elseif(array_key_exists('SCRIPT_NAME', $_SERVER)) {
$urlFast .= $_SERVER['SCRIPT_NAME'];
} else {
$urlFast .= $_SERVER['PHP_SELF'];
}
}
}
$url = $urlFast;
}
return $url;
}
А дальше добавить параметры — элементарно.
Большое спасибо за ответ! Буду прикручивать себе эту функцию. Подскажи пожалуйста, эту функцию (доработанную под меня) можно засунуть в плагин и повесить на событие предложенное выше OnLoadWebDocument?
Всё-таки, функция func_getCurrentURL вам не нужна. Я подумал, что на основе текщего url вам нужно получить новый url с добавленными параметрами (при этом параметры в исходном url могут быть произвольными) — именно так я получаю ссылки для пагинации (путём изменения/добавления параметра page текущему url).
В вашем случае текущий URL и не нужен вообще, нужны только параметры.
Изменить (добавить) параметры при обработке текущего запроса можно 2 способами:
1) «Железный» вариант: на уровне .htaccess (директива redirect с использованием регулярных выражений)
2) В обработчике OnLoadWebDocument (с максимальным приоритетом = 0) добавить недостающие параметры (можно также удалить ненужные) в глобальные массивы:
а) при передаче данных методом POST: $_REQUEST + $_POST
б) при передаче данных методом GET: $_REQUEST + $_GET
И далее в любых сниппетах, функциях, классах, плагинах для получения параметров запроса использовать:
а) либо эти самые глобальные массивы
б) либо метод $modx->request->getParameters($keys, $type) (этот метод как раз и использует вышеуказанные глобальные массивы):
В вашем случае текущий URL и не нужен вообще, нужны только параметры.
Изменить (добавить) параметры при обработке текущего запроса можно 2 способами:
1) «Железный» вариант: на уровне .htaccess (директива redirect с использованием регулярных выражений)
2) В обработчике OnLoadWebDocument (с максимальным приоритетом = 0) добавить недостающие параметры (можно также удалить ненужные) в глобальные массивы:
а) при передаче данных методом POST: $_REQUEST + $_POST
б) при передаче данных методом GET: $_REQUEST + $_GET
И далее в любых сниппетах, функциях, классах, плагинах для получения параметров запроса использовать:
а) либо эти самые глобальные массивы
б) либо метод $modx->request->getParameters($keys, $type) (этот метод как раз и использует вышеуказанные глобальные массивы):
getParameters( string|array $keys = array, string $type = GET )
Get a GPC/REQUEST variable value or an array of values from the request.
Arguments
$keys
stringarray
A key or array of keys to retrieve from the GPC variable. An empty array means get all keys of the variable.
$type
string
The type of GPC variable, GET by default (GET, POST, COOKIE or REQUEST)
Уважаемый Cyrax_02, спасибо тебе огромное за развернутые ответы!
Это все верно, как сформировать ссылку я тоже знаю плюс у тебя все подробно расписано, у меня вопрос то в другом — как мне эту сформированную ссылку засунуть обратно в URL текущей страницы минуя редирект с помощью 301 либо sendRedirect.
Т.е., например, я, как пользователь, захожу из поиска на страницу сайта site.ru/product1.html.
В момент загрузки страницы, я, как программист, формирую нужную мне ссылку сайта с необходимыми GET параметрами:
— взял текущую страницу site.ru/product1.html,
— сформировал каким то образом необходимые параметры из реферера — откуда пришел пользователь, по какому запросу, из какого города.
— засунул данную сформированную ссылку обратно в URL адресную строку браузера
— в конечном итоге в адресной строке наблюдаю уже не site.ru/product1.html, а например site.ru/product1.html?&par1=val1&par2=val2…
Вот это как то можно сделать, минуя редирект?
Заранее спасибо!
Это все верно, как сформировать ссылку я тоже знаю плюс у тебя все подробно расписано, у меня вопрос то в другом — как мне эту сформированную ссылку засунуть обратно в URL текущей страницы минуя редирект с помощью 301 либо sendRedirect.
Т.е., например, я, как пользователь, захожу из поиска на страницу сайта site.ru/product1.html.
В момент загрузки страницы, я, как программист, формирую нужную мне ссылку сайта с необходимыми GET параметрами:
— взял текущую страницу site.ru/product1.html,
— сформировал каким то образом необходимые параметры из реферера — откуда пришел пользователь, по какому запросу, из какого города.
— засунул данную сформированную ссылку обратно в URL адресную строку браузера
— в конечном итоге в адресной строке наблюдаю уже не site.ru/product1.html, а например site.ru/product1.html?&par1=val1&par2=val2…
Вот это как то можно сделать, минуя редирект?
Заранее спасибо!
В момент загрузки страницы url сайта (страницы) уже сформирован. Веб-сервер его уже «проглотил», modx тоже. И инициировать процесс обработки веб-сервером другого url можно только редиректом. А «подменить» уже обрабатываемый url другим в ходе выполнения скрипта — попахивает каким-то низкоуровневым хаком, мне неизвестным.
Да, у меня такой же вывод сформирован. Но редирект не подходит абсолютно. Значит в текущем варианте никак не сделать. Спасибо большое за ответы!
А почему редирект не подходит. Самое оно. Только событие должно быть onHandleRequest. Так все делают.
А «подменить» уже обрабатываемый url другим в ходе выполнения скрипта — попахивает каким-то низкоуровневым хаком, мне неизвестным.SendForward так и работает ;)
Просто очень много страниц в индексе, есть вероятность, что при редиректе вылетят оттуда или еще что то случится нехорошее. Ну и по некоторым еще соображениям.
SendForward так и работает ;)Но ведь он не меняет URL + GET-параметры нельзя указать:
modX::sendForward
Forwards the request to another resource without changing the URL. If the ID provided does not exist, sends to a 404 Error page.
Не, я про другое — запрашивает человек один контент, а получает другой. Тоже своего рода обман.
Всем спасибо за ответы! Задача решилась другим образом. Через счетчик Яндекс.Метрики передал ей нужные параметры, формируемые сниппетом.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.