эмммммм. вы используете файл из моего архива?Sumanai:Вот ещё- гостями так и не отправляется. Я кажется знаю почему- мешает код VEG, который от ботов защищает, капчи не причём.
проверял - работает для гостей. возвращает ошибки
Список разделов › phpBBex 1.x (поддерживается) › Пожелания 1.x
эмммммм. вы используете файл из моего архива?Sumanai:Вот ещё- гостями так и не отправляется. Я кажется знаю почему- мешает код VEG, который от ботов защищает, капчи не причём.
factotum:Подправленный код с поддержкой IE < 10
Мусора нет
 
 factotum:мммммм. вы используете файл из моего архива?
factotum:проверял - работает для гостей. возвращает ошибки


ах вы про это... превью не показывает и в дефолтном phpBBex - подавай имя, капчу и чего там еще. Текущая версия повторяет ровно то, что делает сам phpBBexSumanai:А должно показывать превью.
стиралоSumanai:Кстати ошибки тоже надо стирать перед вставкой следующих, а то плодятся.

!function ($) {
   /* Preview viewtopic*/
   $(function(){
      function preview() {
         var form = document.getElementById("postform")
         var $form = $(form)
         var url = form.action
            .replace('posting.php', 'postingajax.php')
            .replace('ucp.php', 'ucpjax.php')
         $.post( url, $form.serialize() )
         .done(function( data ) {
            // console.log("data:",data)
            if ($("#preview").length){
               $preview = $("#preview")
               $preview.next("hr").remove()
               $preview.remove()
            }
            $(".alert").remove()
            $(".post:last").after(data)
            target = document.getElementById("preview") || document.getElementsByClassName("alert")[0]
            $('html, body').animate({
               scrollTop: $(target).offset().top
            }, 200)
         })
      }
       
      $(document).on('click', '.section-viewtopic input[name=preview]', function(e) {
         e.preventDefault()
         e.stopPropagation()
         preview()
      })
   })
}(window.jQuery)factotum:ах вы про это... превью не показывает и в дефолтном phpBBex - подавай имя, капчу и чего там еще.
   <input type="hidden" name="creation_time" value="0" />
   <input type="hidden" name="form_token" value="0" />
   <script type="text/javascript">
   jQuery(function($)
   {
      $('#postform').submit(function()
      {
         $('inp'+'ut[na'+'me=crea'+'tion_t'+'ime]').val('{RAW_CREATION_TIME}');
         $('in'+'pu'+'t[name'+'=for'+'m_to'+'ken]').val('{RAW_FORM_TOKEN}');
      });
   });
   </script>factotum:нужны небольшие правки на стороне PHP - пропарсить полученные данные


Ок, мне тоже не нравится ковыряться в дебрях phpBBSumanai:В phpBB везде используется request_var, придётся это обходить.
!function ($) {
   /* Preview viewtopic*/
   $(function(){
      function preview() {
         var form = document.getElementById("postform")
         var formData = new FormData(form)
         formData.append("preview", "")
         var url = form.action
            .replace('posting.php', 'postingajax.php')
            .replace('ucp.php', 'ucpjax.php')
         // console.log("form:",form,"formdata:",formData,"url:",url)
         $.ajax({
            global: false,
            type: "POST",
            url: url,
            data: formData,
            cache: false,
            contentType: false,
            processData: false,
         })
         .done(function(data){
               // console.log("data:",data)
               if ($("#preview").length){
                  $preview = $("#preview")
                  $preview.next("hr").remove()
                  $preview.remove()
               }
               $(".alert").remove()
               $(".post:last").after(data)
               target = document.getElementById("preview") || document.getElementsByClassName("alert")[0]
               $('html, body').animate({
                  scrollTop: $(target).offset().top
               }, 200)
            })
      }
       
      $(document).on('click', '.section-viewtopic input[name=preview]', function(e) {
         e.preventDefault()
         e.stopPropagation()
         preview()
      })
   })
}(window.jQuery)не согласенSumanai:Только вот дефолтная версия при предъявлении всего этого нормально показывает превью, а ваша отлупливает со стандартным сообщением.


не так что бы очень. скажем, с видом на негоSumanai:У вас я вижу код вывода блока ошибок приспособлен для вашего стиля.

factotum:не согласен



!function ($) {
   /* Preview viewtopic*/
   $(function(){
      function preview() {
         var form = document.getElementById("postform")
         var url = form.action
            .replace('posting.php', 'postingajax.php')
         $
            .post( url, $(form).serialize() + '&preview' )
            .done(function(data){
               if ($("#preview").length){
                  $preview = $("#preview")
                  $preview.next("hr").remove()
                  $preview.remove()
               }
               $(".alert").remove()
               $(".post:last").after(data)
               target = document.getElementById("preview") || document.getElementsByClassName("alert")[0]
               $('html, body').animate({
                  scrollTop: $(target).offset().top
               }, 200)
            })
      }
       
      $(document).on('click', '.section-viewtopic input[name=preview]', function(e) {
         e.preventDefault()
         e.stopPropagation()
         preview()
      })
   })
}(window.jQuery)обманул. ради любопытства сделал так:factotum:данные ловятся банально через $_POST('name'), соотвественно все, что с $_POST должно работать корректно. Но request_var придется сначала отфильтровать от переменных в урле (урл остался без изменений), к остальному привить $_POST...
// Output page ...
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
   if (@extension_loaded('zlib') && !headers_sent() && ob_get_level() <= 1 && ob_get_length() == 0) {
      ob_start('ob_gzhandler');
   } else {
      ob_start();
   }
   header('Content-type: text/html; charset=UTF-8');
   if (sizeof($error)) {
      echo '<div class="alert alert-danger"><p class="error">' .  implode('</p><p class="error">', $error) . '</p></div>';
   } else {
      $template->set_filenames(array(
         'body' => 'posting_preview.html')
      );
      $template->display('body');
   }
   $message = utf8_normalize_nfc(request_var('message', '', true));
   echo $message;
   $size = ob_get_length(); // Определяем длину контента
   header("Content-Length: $size"); // Помещаем длину в заголовок ответа
   ob_end_flush(); // Закрываем буфер
   flush(); // Отдаем содержимое
   ob_end_clean(); // Сбрасываем буфер
   garbage_collection(); // Сбрасываем кеш и закрываем соединения с базой
   exit_handler();// Закрываем соединения с присоедененными приложениями
   die();
}

factotum:Попробую глянуть, где затык
!function ($) {
   /* Preview viewtopic*/
   $(function(){
      function preview() {
         var form = document.getElementById("postform")
         var url = form.action
            .replace('posting.php', 'postingajax.php')
         $
            .post( url, $(form).serialize() + '&preview=preview' )
            .done(function(data){
               if ($("#preview").length){
                  $preview = $("#preview")
                  $preview.next("hr").remove()
                  $preview.remove()
               }
               $(".alert").remove()
               $(".post:last").after(data)
               target = document.getElementById("preview") || document.getElementsByClassName("alert")[0]
               $('html, body').animate({
                  scrollTop: $(target).offset().top
               }, 200)
            })
      }
       
      $(document).on('click', '.section-viewtopic input[name=preview]', function(e) {
         e.preventDefault()
         e.stopPropagation()
         preview()
      })
   })
}(window.jQuery)// Output page ...
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
   header('Content-type: text/html; charset=UTF-8');
   header( 'Expires: Wed, 11 Jan 1984 05:00:00 GMT' );
   header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' );
   header( 'Cache-Control: no-cache, must-revalidate, max-age=0' );
   header( 'Pragma: no-cache' );
   ob_start();
   if (sizeof($error)) {
      echo '<div class="alert alert-danger"><p class="error">' .  implode('</p><p class="error">', $error) . '</p></div>';
   }
   $template->set_filenames(array(
      'body' => 'posting_preview.html')
   );
   $template->display('body');
   $data = ob_get_contents(); // Помещаем вывод в переменную
   $size = ob_get_length(); // Определяем длину контента
   ob_end_clean(); // Закрываем и сбрасываем буфер
   header("Content-Length: $size"); // Помещаем длину в заголовок ответа
   echo $data; // Вывод
   garbage_collection(); // Сбрасываем кеш и закрываем соединения с базой
   exit_handler();// Закрываем соединения с присоединенными приложениями
}factotum:Все, работает.
// Output page ...
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
   header('Content-type: text/html; charset=UTF-8');
   header( 'Expires: Wed, 11 Jan 1984 05:00:00 GMT' );
   header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' );
   header( 'Cache-Control: no-cache, must-revalidate, max-age=0' );
   header( 'Pragma: no-cache' );
   ob_start();
   if (sizeof($error)) {
      echo '<div class="alert alert-danger"><p class="error">' .  implode('</p><p class="error">', $error) . '</p></div>';
   }
   else{
   $template->set_filenames(array(
      'body' => 'posting_preview.html')
   );
   $template->display('body');
   }
   $data = ob_get_contents(); // Помещаем вывод в переменную
   $size = ob_get_length(); // Определяем длину контента
   ob_end_clean(); // Закрываем и сбрасываем буфер
   header("Content-Length: $size"); // Помещаем длину в заголовок ответа
   echo $data; // Вывод
   garbage_collection(); // Сбрасываем кеш и закрываем соединения с базой
   exit_handler();// Закрываем соединения с присоединенными приложениями
}factotum:Добавлены необходимые заголовки
factotum:Остается обыграть гостей.


есть другое мнение. я пока не исключаю сценарии, где могут выводиться и ошибки, и превью. Правильней было бы что-то вроде такого:Sumanai:Подправленный PHP
Ок, прокрутим к ошибкеSumanai:Маленький баг- при предпросмотре пустого или ошибочного сообщения вместе с блоком ошибки появляется и пустой блок предпросмотра, к которому прокручивает (а не к блоку с ошибкой, который выше).
нормальный корректный заголовокSumanai:Точно необходимые? Last-Modified я бы выкинул.
 
  
 тыкните, пожалуйста.Sumanai:Я приводил код, который нужно выполнить.
не обязательно. если только тоукен. При превью вводить каждый раз капчу бессмыслено и беспощадноSumanai:Для окончательного совершенства надо обновлять токен и капчу.

factotum:я пока не исключаю сценарии, где могут выводиться и ошибки, и превью.
factotum:нормальный корректный заголовок
factotum:тыкните, пожалуйста.
factotum:не обязательно. если только тоукен.
factotum:При превью вводить каждый раз капчу бессмыслено и беспощадно


мало ли. код ниже расставляет все на свои места.Sumanai:Я таких случаев не помню.
как-то так:factotum:if (sizeof($message)) { // проверяем размер сообщения
$template->set_filenames(array(
'body' => 'posting_preview.html')
}
   if (!empty($message_parser->message)) {
      $template->set_filenames(array(
         'body' => 'posting_preview.html')
      );
      $template->display('body');
   }заголовки http должны быть корректными. из-за одной строки в заголовке с сервером ничего страшного не будет точно.Sumanai:Лишний по моему. Эти заголовки весят больше, чем некоторые сообщения.
Sumanai:По мне так обаятельно. И уничтожать в БД предыдущий. А то заддосят легко.
вот не знаю. мне почему то захотелось просто отключить превью для гостей. а зодосить могут в пределах безопасности самого posting.php - запрос проходит все стандартные проверки независимо от того, как он послан - напрямую через http или через AJAX. Хотя обновить тоукен может оказаться не лишним. Но толку. Скажем Вы злоумышленник. Написали чего или долбите вручную напару с ботом. Либо движок пошлет сразу из-за отсутствия тоукена. Либо Вы научились его ловить. В этом случае обновление тоукена - еще одна операция, лишь нагружающая движок. Ни больше, ни меньше.Sumanai:Я имел в виду при ошибке прохождения. Раз прошёл правильно- это должно запомнится.
это стандартная процедура при отправке сообщения. разве превью проходит эти проверки в сдандартной реализации?Sumanai:Вот эта антибот функция, работу которой необходимо выполнить перед предпросмотром сообщения костями:
factotum:заголовки http должны быть корректными.
factotum:если постинг отдает все без времени и тоукена в нашем случае,
factotum:добавить небольшой фоллбек:
$preview   = (isset($_POST['preview'])) ? true : false;$ajax   = (isset($_POST['ajax'])) ? true : false;if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) || $ajax == true) {.post( url, $(form).serialize() + '&preview=preview' ).post( url, $(form).serialize() + '&preview=preview' + '&ajax=true' )

может бытьSumanai:$ajax == true
factotum:вот ответы на все вопросы:
factotum:это запрос к серверу через AJAX
заполняется это для всех и всегда

factotum:это запрос к серверу через AJAX
заполняется это для всех и всегда


Ваша правда, виноват. Можно добавить. Так заработает и у гостей.Sumanai:Это у пользователя. У гостя creation_time и form_token изначально пустые, и заполняются перед отправкой стандартными средствами. Наш же код идёт мимо, не запуская заполнение этих полей. Проверьте, у гостей они в коде страницы пустые.
factotum:было лень править шаблон.
factotum:потратил целый час двадцать четыре минуты.
 
 factotum:было лень править шаблон. заодно решил проверить насколько правильней было отдавать тоукен через костыли: http://regexr.com?36kse
вот и конец всем костылям


пример выборки кода из страницыSumanai:Что там
!function ($) {
   /* Preview viewtopic*/
   $(function(){
      function preview() {
         var form = document.getElementById("postform")
         if (form.form_token.value == 0) {
            var text = form.textContent || form.innerText
            var token = /[a-z0-9]{38,40}/g.exec(text);
            form.form_token.value = token[0]
            var time = /\.val\('(\d{10})/g.exec(text);
            form.creation_time.value = time[1]
            console.log("text:",text,"token:",token[0],"time:",time[1])
         }
         var $form = []
         $form = $(":input[value!='']", form).serialize() + '&preview='
         // $.grep($form,function(n){ return(n) });
         var url = form.action
            .replace('posting.php', 'postingajax.php')
         $
            .post( url, $form )
            .done(function(data){
               if ($("#preview").length){
                  $preview = $("#preview")
                  $preview.next("hr").remove()
                  $preview.remove()
               }
               $(".alert").remove()
               $(".post:last").after(data)
               target = document.getElementsByClassName("alert")[0] || document.getElementById("preview")
               $('html, body').animate({
                  scrollTop: $(target).offset().top
               }, 200)
            })
      }
       
      $(document).on('click', '.section-viewtopic input[name=preview]', function(e) {
         e.preventDefault()
         e.stopPropagation()
         preview()
      })
   })
}(window.jQuery)