Формирование URL в MODx Revo

Добрый день уважаемое сообщество!
Подскажите пожалуйста такой вопрос — как формируются ссылки в MODx?

Т.е. задача, нужно сформировать ссылку в адресной строке, когда человек пришел с поисковой системы. Как это сделать именно в момент загрузки страницы? Чтобы ссылка формировалась вида — site.ru/catalog/product.html?&par1=val1&par2=val2 и т.д.

Натолкните на мысли пожалуйста!

Заранее спасибо!
Денис
11 ноября 2014, 08:34
modx.pro
3
10 025
0

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

Наумов Алексей
11 ноября 2014, 12:04
0
[[~123? &par1=`val1` &par2=`val2`]]
    Денис
    11 ноября 2014, 12:21
    0
    Спасибо за ответ. Это не то, что надо. Этот способ я прекрасно знаю для формирования URL для ресурса.
    Интересует другое. В момент загрузки страницы нужно перехватить текущий URL, и дописать в конец нужные мне параметры. Т.е. как именно перехватить URL? Смотрю в сторону плагина с событием OnHandleRequest. Не до конца понимаю, что означает это событие, но мне кажется должно подойти. Смотрел в других примерах, например как сформировать фроинд урл из GET параметров, там как раз плагин вешается на это событие.
    Буду благодарен, если кто то подскажет про это точнее.
    but1head
    11 ноября 2014, 13:09
    0
    Через плагины, вешаете вроде на OnLoadWebDocument
      Денис
      11 ноября 2014, 13:14
      0
      Спасибо, попробую!
      А есть возможность то обратно в строку браузера запихать этот исправленный $url?
      Cyrax_02
      11 ноября 2014, 13:15
      1
      +1
      Вот функция для определения текущего 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;
          }
      А дальше добавить параметры — элементарно.
        Денис
        11 ноября 2014, 13:33
        0
        Большое спасибо за ответ! Буду прикручивать себе эту функцию. Подскажи пожалуйста, эту функцию (доработанную под меня) можно засунуть в плагин и повесить на событие предложенное выше OnLoadWebDocument?
          Cyrax_02
          11 ноября 2014, 18:44
          +1
          Всё-таки, функция 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) (этот метод как раз и использует вышеуказанные глобальные массивы):

          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)
            Денис
            11 ноября 2014, 19:27
            0
            Уважаемый 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…

            Вот это как то можно сделать, минуя редирект?
            Заранее спасибо!
              Cyrax_02
              11 ноября 2014, 19:55
              +1
              В момент загрузки страницы url сайта (страницы) уже сформирован. Веб-сервер его уже «проглотил», modx тоже. И инициировать процесс обработки веб-сервером другого url можно только редиректом. А «подменить» уже обрабатываемый url другим в ходе выполнения скрипта — попахивает каким-то низкоуровневым хаком, мне неизвестным.
                Денис
                11 ноября 2014, 20:00
                0
                Да, у меня такой же вывод сформирован. Но редирект не подходит абсолютно. Значит в текущем варианте никак не сделать. Спасибо большое за ответы!
                  Сергей Шлоков
                  12 ноября 2014, 08:03
                  0
                  А почему редирект не подходит. Самое оно. Только событие должно быть onHandleRequest. Так все делают.
                  Сергей Шлоков
                  12 ноября 2014, 08:06
                  0
                  А «подменить» уже обрабатываемый url другим в ходе выполнения скрипта — попахивает каким-то низкоуровневым хаком, мне неизвестным.
                  SendForward так и работает ;)
                    Денис
                    12 ноября 2014, 08:11
                    0
                    Просто очень много страниц в индексе, есть вероятность, что при редиректе вылетят оттуда или еще что то случится нехорошее. Ну и по некоторым еще соображениям.
                      Cyrax_02
                      12 ноября 2014, 14:00
                      0
                      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.
                        Сергей Шлоков
                        12 ноября 2014, 14:18
                        0
                        Не, я про другое — запрашивает человек один контент, а получает другой. Тоже своего рода обман.
            Денис
            12 ноября 2014, 14:51
            0
            Всем спасибо за ответы! Задача решилась другим образом. Через счетчик Яндекс.Метрики передал ей нужные параметры, формируемые сниппетом.
              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
              16