factotum:тут рабочий пример Livepreview. Довести до ума и будет счастье
Ну да, минипрофиля нет. Да и отправка по каждому символу раз в секунду
 завалит любой сервер, кроме разве что вконтакта и круче.
  завалит любой сервер, кроме разве что вконтакта и круче.Список разделов › phpBBex 1.x (поддерживается) › Пожелания 1.x
factotum:тут рабочий пример Livepreview. Довести до ума и будет счастье
 завалит любой сервер, кроме разве что вконтакта и круче.
  завалит любой сервер, кроме разве что вконтакта и круче.

Если загружать предпросмотр во фрейм, то будет работать.factotum:ну и лайвпревью не совсем подойдет при использовании бб-медиа/ajax-based бб-тегов.


если честно, задачи предосмотра в реалтайм не ставил. думаю, пока остановлюсь на предосмотре по клику на "предосмотр". если станет тесно, будем двигаться дальшеVEG:Если загружать предпросмотр во фрейм, то будет работать.
не завалит. но сетевые пакеты да, сыплются как из ведра. По другому нужно делать обработчик на js или обновлять по требованию. В последнем случае уже не лайв, но без редиректов.Sumanai:завалит любой сервер, кроме разве что вконтакта и круче.
там реализация без заморочек. плагин определяет активность и отсылает содержимое формы в парсер. После пересылает полученный контент в условленный ноуд. Определить ид автора не составит труда. Думаю, можно сделать красиво.Sumanai:минипрофиля нет
factotum:думаю, пока остановлюсь на предосмотре по клику на "предосмотр".
factotum:плагин определяет активность и отсылает содержимое формы в парсер.



есть вариант еще один. но это в моем случае с markitup. При вставке bbcode текстовый процессор создает индивидуальное событие. К нему и можно привязать обновление. Либо дописывать события в дефолтные скрипты phpBB, чтобы в итоге получить markitup...Sumanai:Не похоже. В файрбаге запросы каждую секунду.


<?php
define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
include($phpbb_root_path . 'includes/bbcode.' . $phpEx);
include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
include($phpbb_root_path . 'includes/message_parser.' . $phpEx);
$user->session_begin();
$auth->acl($user->data);
$user->setup();
$parser = new parse_message(utf8_normalize_nfc(request_var('text', '', true)));
$parser->parse(true, true, true);
$output    = $parser->format_display(true, true, true, false);
echo $output;
?><span id="btn-preview" class="btn btn-link">{L_PREVIEW}</span>!function ($) {
   /* Preview */
   $(function(){
      function preview() {
         // Получаем содержимое панели ответа и помещаем его в переменную text, объявленную в парсере
         var text = "text="+encodeURIComponent(document.getElementById("message").value)
         //Техническая строка - выводит содержимое, которое получили. можно удалить
         console.log('text:',text)
         // Выполняем сам запрос
         $.ajax({
            type: 'POST',
            dataType: 'text',
            global: false,
            //Выше отменяем ненужную глобальность объектов. Ниже в url указываем адрес, по которому будем стучаться
            url: 'preview.php',
               data: text,
               success: function(data) {
                  // отладочная строка - выводим в консоль что нам прислал парсер
                  console.log('data:',data)
                  // ломим место, где нам нужно показать превью и подставляем туда полученное от парсера содержимое 
                  $('#preview').html(data)
               },
               // На всякий случай для ошибки. Можно сообщить что-нибудь стоящее, пока отладочный код
               error: function(xhr, status, error) {
                  var err = eval("(" + xhr.responseText + ")");
                  alert(err.Message);
               }
            })
      }
      // ждем клика на кнопку превью
      $(document).on('click', '#btn-preview', function(e) {
         e.preventDefault()
         preview()
      })
   })
}(window.jQuery)factotum:В принципе можно использовать разметку полноценного поста с данными текущего пользователя.
factotum:В форме быстрого ответа убиваем текущую кнопку
factotum:возник вопрос. нужно ли обрабатывать bbcode_uid?
factotum:<div id="preview"></preview>
<div id="preview"></div>.Sumanai:message_parser должен его обрабатывать. Он нужен, иначе ббкоды не признаются.


даSumanai:То есть вы хотели написать <div id="preview"></div>.
 Поправьте, пожалуйста, в посте. У меня редактирование уже закрыто.
 Поправьте, пожалуйста, в посте. У меня редактирование уже закрыто.разбухает из-за конвертации символов. По другому никак. Это не критично.Sumanai:Вот, сваял за 5 минут:
строку:factotum:разбухает из-за конвертации символов. По другому никак. Это не критично.
var text = "text="+encodeURIComponent(document.getElementById("message").value)var text = $('#message').val()var text = $('#message').val()
text = "text=" + textfactotum:В хроме работает корректно. Нужно тестировать в других браузерах


factotum:Sumanai, есть у меня другая идея. Надеюсь, правильная.
factotum:Что дописать в запрос, чтобы попасть на страницу с превью?
чет не могу поймать этот параметр тут


phpbb нужно жить, чтобы понимать все нюансы джунглей кода.Sumanai:Озвучите?
уже поймал. Content-Disposition: form-data; name="preview"Sumanai:Я тоже.
!function ($) {
   /* Preview */
   $(function(){
      function preview() {
         var form = document.postform
         var formData = new FormData(form)
         formData.append("preview", "")
         var url = form.action
         console.log("form:",form,"formdata:",formData,"url:",url)
         $.ajax({
            type: "POST",
            url: url,
            data: formData,
            cache: false,
            contentType: false,
            processData: false,
            success:  function(data){
               //alert("---"+data);
               console.log("data:",data)
            }
         })
      }
       
      $(document).on('click', '#btn-preview', function(e) {
         e.preventDefault()
         e.stopPropagation()
         preview()
      })
   })
}(window.jQuery)


как минимум - не нужно парится с php. Для меня код phpBB дремучий лес, повернутый к фронд-энд разработчикам нифига не лицом. А вот из формы ответа сделать шлюз для работы через ajax - почему бы и нет?Sumanai:И да, посылает всю страницу целиком. Ну нафиг такой аджакс.
factotum:Для меня код phpBB дремучий лес, повернутый к фронд-энд разработчикам нифига не лицом.
 (утрирую).
  (утрирую).factotum:Самом собой, в итоге нужно подменить все операции с формой быстрого ответа на запросы к шлюзу через аджакс.


допилить можно то, где железно понимаешь как это работает и последствия. Если не уверен, чем это обернется - не трогать!Sumanai:Во многих случаях даже условие писать не надо- только дополнить.
разобрался немного.factotum:Где лучше смотреть, чтобы posting.php отдавал данные в JSON?
header('Content-type: application/json'); /* добавляем ревалентый заголовок при ответе страницы*/
/* Небольшой пример отправки данных превью */
$previewrow = array('message' => $preview_message, 'signature' => $preview_signature, 'signature_uid' => $preview_signature_uid, 'signature_bitfield' => $preview_signature_bitfield );
echo json_encode($previewrow);!function ($) {
   /* Preview */
   $(function(){
      function preview() {
         // Собираем данные формы. Пока так, но в этом виде отсылает кучу не нужных данных. Правильней собрать значения полей input
         var form = document.postform
         var formData = new FormData(form)
         // добавляем событие предосмотра
         formData.append("preview", "")
         // Обрабатываем линк на парсер формы, подменяя posting.php на свой обработчик
         var url = form.action.replace('posting.php', 'postingajax.php');
         // Поглядываем в консоли на полученные данные
         console.log("form:",form,"formdata:",formData,"url:",url)
         // Отправляем запрос
         $.ajax({
            type: "POST",
            url: url,
            data: formData,
            dataType: "json",
            cache: false,
            contentType: false,
            processData: false,
            success:  function(data){
               console.log("data:",data)
            }
         })
      }
       // Слушаем клик по кнопке предосмотра
      $(document).on('click', 'input[name=preview]', function(e) {
         e.preventDefault()
         // Останавливаем действие по умолчанию
         e.stopPropagation()
         // Отправляем данные формы и получаем обработанные события
         preview()
      })
   })
}(window.jQuery)