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=" + text
factotum:В хроме работает корректно. Нужно тестировать в других браузерах
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)