We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 28365
    • 4 Posts
    При запросе адреса типа
    http://web-site.ru/some-page.html?version=print
    нужно подменить шаблон страницы на шаблон версии для печати

    Пытался делать так:
    плагин отслеживает событие OnLoadWebDocument

    // id шаблона версии для печати
    $print_template_id = 6;
    
    if (isset($_GET['version'])) {
        if ($_GET['version'] == 'print') {
           
            $modx->documentObject['template'] = $print_template_id;
    
            $query = 'SELECT * FROM '.$this->getFullTableName("site_templates").' WHERE '.$modx->getFullTableName("site_templates").'.id = '.$print_template_id;
    
            $result = $modx->dbQuery($query );
    
            $count = $this->recordCount($result);
    
            if ($count == 1) {
                $row = $this->fetchRow($result);
                $modx->documentContent = $row['content'];
            }
        }
    }
    


    Проблема в том, что при первом запуске плагин срабатывает, а при последующих - нет.
    В чем может быть ошибка?

    Может кто знает другие способы создания "версии для печати"?
      • 1593
      • 20 Posts
        • 897
        • 1,620 Posts
        по мне так самое верное это юзать CSS с media print и все будет ха-ра-шо! laugh
          "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

          Не используйте Revo для "просто сайтов". Используйте Evo

          Who can defeat the Russian bear?
          • 1593
          • 20 Posts
          Смену темплейта на лету удобно использовать и в других случаях. Например когда нужно в новом окне выводить не полную версию страницы а только карточку продукта.
            • 28365
            • 4 Posts
            Вешаю на OnLoadWebDocument плагин:

            echo 'TEST';
            

            так не работает


            echo 'TEST';
            exit;
            

            так работает

            пробовал убирать кеширование со страниц, не помогло
              • 28365
              • 4 Posts
              Проблема была с кешированием
              Теперь повесил плагин также и на событие OnLoadWebPageCache

              Возникла другая проблема - не обрабатываются метки [*content*] и т.д.

              Как можно принудительно вызвать обработку документа?
                • 26709
                • 4 Posts
                Есть еще один способ. Я создал снипет. Нужно сделать вот что. Создаем снипет с таким кодом
                
                global $HTTP_REFERER;
                
                echo "<LINK HREF=\"/assets/templates/konotop/style.css\" REL=\"stylesheet\" TYPE=\"text/css\" media=\"screen\">";
                
                $startingpoint = "<!-- startprint -->";
                $endingpoint = "<!-- stopprint -->";
                // let's turn off any ugly errors for a sec so we can use our own if necessary...
                error_reporting(0);
                // $read = fopen($HTTP_REFERER, "rb") ... this line may work better if you're using NT, or even FreeBSD
                $read = fopen($HTTP_REFERER, "r") or die("<br /><font face=\"Verdana\">Sorry! There is no access to this file directly. You must follow a link. <br /><br />Please click your browser's back button. </font>");
                // let's turn errors back on so we can debug if necessary
                error_reporting(1);
                
                $value = "";
                while(!feof($read)){
                $value .= fread($read, 10000); // reduce number to save server load
                }
                fclose($read);
                $start= strpos($value, "$startingpoint"); 
                $finish= strpos($value, "$endingpoint"); 
                $length= $finish-$start;
                $value=substr($value, $start, $length);
                
                function i_denude($variable) {
                return(eregi_replace("<img src=[^>]*>", "", $variable));
                }
                function i_denudef($variable) {
                return(eregi_replace("<font[^>]*>", "", $variable));
                }
                
                $PHPrint = ("$value");
                if ($stripImages == "yes") {
                $PHPrint = i_denude("$PHPrint");
                }
                
                $date=date("d. m. Y");
                $PHPrint = i_denudef("$PHPrint");
                $PHPrint = str_replace( "</font>", "", $PHPrint );
                $PHPrint = stripslashes("$PHPrint"); 
                
                echo"<input type=button value=\"Печатать\" onClick=\"print(document);\">";
                echo"<input type=button value=\"Закрыть окно\" onClick=\"javascript:self.close();\"><br><br>";
                echo "<table width=100% bgColor=#ccd9e9 class=votequest><tr><td>Распечатано: ".$date."</td></tr></table><br>";
                echo "<base href=\"$baseURL\">";
                
                
                echo $PHPrint; 
                // Next line is invisible except to SE crawlers, please don't remove. Thanks! :)
                echo "<br/><br/>Страница отпечатана с сайта: $HTTP_REFERER";
                flush (); 
                


                Потом создаем страницу невидимую без кеширования (например printversion) и вызываем в нем этот снипет

                На странице, которой нужно сделать версию для печати, ограничиваем нужную порцию контента строками <!-- startprint --> и <!-- stopprint --> (все что между ними, будет в странице для печати. Их можно менять вверху кода снипета) и вешаем на этой странице ссылку на страницу printversion.

                Все. Юзайте на здоровье smiley
                  • 24364
                  • 54 Posts
                  Спасибо Serg ! Как раз то что я так долго искал
                    Меня банят на всех форумах! Низачто!!!
                    • 26586
                    • 184 Posts
                      • 5675
                      • 120 Posts
                      Э... Как уже высказались предыдущие ораторы, ссылка "версия для печати" устарела настолько, что ставить её - дикость. На CSS всё это делается прекрасно, в - принципе, неважно даже какая вёрстка - слоёная или табличная, пару лишних ID вставить в нужные места и не надо городить городильню
                        Автор благодарит алфавит за любезно предоставленные буквы