We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 26709
    • 4 Posts
    Всем привет.
    У меня возникла несколько нестандартная задача и очень надеюсь на подсказку. Постараюсь подробно описать. Суть в том, что у меня на сайте есть страница с новостями, в которой по умолчанию выводятся новости за ТЕКУЩУЮ дату. Справа в колонке есть календарь, в котором можно выбрать любую дату и тогда отобразятся новости за выбранную дату. Сам механизм работы с датой очень простой. Сама страница новостей имеет адрес типа http://sitename/news , а при клике на дату в календаре, например, на 21 янв. 2011 года ссылка становится http://sitename/news?date=20110121 Все работает нормально, но есть одно НО. мне нужно избавиться от этого GET-хвоста и вместо http://sitename/news?date=20110121 сделать http://sitename/news/date/20110121.

    Можно это сделать с помощью mod_rewrite, но пока что это вариант мне не подходит. Я поступил другим способом. Создал плагин:

    $url = parse_url($_SERVER[REQUEST_URI]);
    $url_array=explode("/",$url[’path’]);
    $link=array_pop($url_array);
    $path=implode("/",$url_array);
    $domain = substr($modx->config[’site_url’], 0, strlen($modx->config[’site_url’])-1);

    if ($path=="/news/date" ) {
    ob_start();
    echo file_get_contents($domain."/news/date?=".$link);
    $content = ob_get_contents();
    ob_end_clean();
    if($content) {
    echo $content; exit();
    }
    }

    И повесил его на событие OnPageNotFound
    Все работает нормально. Но в таком случае на отдаваемой странице пропадают переменные сессии. Т.е. если я был залогинен на сайте. то при выводе страницы этим плагином я уже НЕ ЗАЛОГИНЕН. это и понятно, ведь file_get_contents просто отдает контент, не учитывая переменные сессии. Но меня это не устраивает. Я попробовал вместо file_get_contents использовать $modx->sendForward , но таким способом можно отобразить страницу либо по алиасу, либо по ИД. А подставить GET запросы в конец не получится. С помощью $modx->sendRedirect номарльно, но вместо http://sitename/news/date/20110121 перебрасывает обратно на http://sitename/news?date=20110121 - а это мне не нужно.

    В обшем, вопрос в том, как мне с помощью этого плагина отобразить нужную страницу, при этом чтобы обработался GET и сохранились сессии + УРЛ остался вида http://sitename/news/date/20110121. Заранее очень благодарен за наводку или на готовое решение.
      • 26586
      • 184 Posts
      попробуй
      $modx->sendForward($id, 'HTTP/1.0 302 Moved Temporarily');
      

      или
      $modx->sendForward($id, 'HTTP/1.1 303 See Other');
      
        • 9085
        • 630 Posts
        А почему не mod_rewrite??? rolleyes (если не секрет, конечно)
          Правильно заданный вопрос повышает вероятность получения нужного ответа.
          Что-то не работает? Загляните в лог ошибок!
          Есть проблема? "Локализуйте" её!
          Ответы на большинство вопросов по MODx | MODx RTFM | API Evo Revo | галопом по Европам Азиям smiley wikibooks(ru) Ditto(en) | Wayfinder e-book | Заметки и о MODx
          • 26709
          • 4 Posts
          Quote from: Segr at Jan 22, 2011, 06:29 AM

          попробуй
          $modx->sendForward($id, 'HTTP/1.0 302 Moved Temporarily');
          

          или
          $modx->sendForward($id, 'HTTP/1.1 303 See Other');
          


          Спасибо, но не совсем подходит. Поскольку тут можно указать только ID документа. а задать ему доп. GET-параметры нельзя
            • 26709
            • 4 Posts
            Quote from: esche at Jan 22, 2011, 08:38 AM

            А почему не mod_rewrite??? rolleyes (если не секрет, конечно)
            Потому что засоряется log лишним мусором. но все же пришлось сделать mod_rewrite, поскольку другие варианты не подходят.
              • 26586
              • 184 Posts
              Quote from: Serg24 at Jan 23, 2011, 07:07 AM

              Quote from: Segr at Jan 22, 2011, 06:29 AM

              попробуй
              $modx->sendForward($id, 'HTTP/1.0 302 Moved Temporarily');
              

              или
              $modx->sendForward($id, 'HTTP/1.1 303 See Other');
              


              Спасибо, но не совсем подходит. Поскольку тут можно указать только ID документа. а задать ему доп. GET-параметры нельзя
              Ну так разбери чем занимается sendForward и перепиши под себя, с передачей GET параметров.
              Как раз эти два ответа фактически эмулируют действие rewriterule, тольк на строне клиента.
                • 9085
                • 630 Posts
                Quote from: Serg24 at Jan 23, 2011, 07:08 AM

                Quote from: esche at Jan 22, 2011, 08:38 AM

                А почему не mod_rewrite??? rolleyes (если не секрет, конечно)
                Потому что засоряется log лишним мусором. но все же пришлось сделать mod_rewrite, поскольку другие варианты не подходят.
                Для log-ов это характерно grin
                Если они в дальнейшем используются, можно слегка подкорректировать их перед обработкой... А если нет - так ничего страшного: ресурсы нынче не особо дорогие..
                ps. Внутренне торжествую, потому как победа все-таки за mod_rewrite (не знаю, что над чем взяло вверх.. но начальная постановка задачи напоминает головоломку /али ТРИЗадачу/, когда очевидный путь решения запрещён)
                  Правильно заданный вопрос повышает вероятность получения нужного ответа.
                  Что-то не работает? Загляните в лог ошибок!
                  Есть проблема? "Локализуйте" её!
                  Ответы на большинство вопросов по MODx | MODx RTFM | API Evo Revo | галопом по Европам Азиям smiley wikibooks(ru) Ditto(en) | Wayfinder e-book | Заметки и о MODx