Парсинг BBCode через AJAX

Список разделов phpBBex 1.x (поддерживается) Пожелания 1.x

Описание: В phpBBex 1.x чего-то не хватает? Напишите об этом здесь, и мы постараемся исправиться.
Правила раздела: Одна тема — один запрос новой возможности. Обязательно формируйте внятный заголовок, максимально отражающий суть вашей идеи. Также приведите примеры, где предлагаемая вами возможность будет актуальна.
Модератор: Поддержка

Сообщение #41 Sumanai » 01.10.2013, 20:55

factotum:Интересны мнения других. Может найдутся минисы

Я как всегда считаю, что лучше движок попилить, чем плодить файлы.
Мой вариант- в posting.php перед
строка 1567 : // Output page ...
добавить перед
Код: Выделить всё
//Проверяем заголовок, если запрос аякс- отдаём json, если нет- идём дальше
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')
{
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);
exit;
}
И соответственно в яваскрипт удалить подмену парсера формы.

Вопрос такой- и что с этим json теперь делать?
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #42 factotum » 05.10.2013, 17:04

Sumanai:как всегда считаю, что лучше движок попилить, чем плодить файлы.
особой разницы не вижу. Скорее предпочитаю работать с отдельным файлом, чтобы не влиять на работу исходного кода и не потерять результаты при обновлении.
Sumanai:Вопрос такой- и что с этим json теперь делать?
вставить в нужное место.
Код: Выделить всё
success:  function(data){
               console.log("data:",data) // тут мы уже имеем пропарсенный контент. манипулируем с ним на свое усмотрение
               $("#preview") // определяем куда вставить
                              .append(data.message) // вставляем полученные данные
            }
Не проверял на работоспособность PHP. Если работает - потихоньку добавлять различные сценарии (превью при создании темы, создании опроса, вложения и т.д.)

JSON - потому что просто обрабатывать. Если словить html - придется только фильтровать данные, что довольно замороченно
factotum
Автор темы
Откуда: Люксембург
Репутация: 234
С нами: 12 лет

Сообщение #43 Sumanai » 05.10.2013, 18:10

factotum:Скорее предпочитаю работать с отдельным файлом, чтобы не влиять на работу исходного кода и не потерять результаты при обновлении.

Только вот при обновлении ваш отдельный файл так же придётся обновлять, иначе можно нарваться на некорректную работу старого файла с новой базой.

factotum:вставить в нужное место.

Угу. Просто не разбираюсь в яваскрипт и не работал с JSON. Как я понимаю, по аналогии можно добавить остальное.

factotum:Не проверял на работоспособность PHP.

В смысле моего? Пашет. Даже тайтлы у смайликов нормально обработались, чего не было у первого варианта.
Только вот не очищает место вставки, а дописывает :smile:

Добавлено спустя 8 минут 51 секунду:
Sumanai:Только вот не очищает место вставки, а дописывает :smile:

Замена кода вставки на
Код: Выделить всё
 .html(data.message)
Вроде решило проблему.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #44 factotum » 05.10.2013, 18:25

Sumanai:Даже тайтлы у смайликов нормально обработались
используем стандартный обработчик событий. А это значит, что можем получать любые события постинга корректно
Sumanai:Только вот не очищает место вставки, а дописывает
Виноват, исправляюсь:
Код: Выделить всё
success:  function(data){
               console.log("data:",data) // тут мы уже имеем пропарсенный контент. манипулируем с ним на свое усмотрение
               $("#preview") // определяем куда вставить
                              .remove() // Удаляет все содержимое, включая html
                              .append(data.message) // вставляем полученные данные
            }
factotum
Автор темы
Откуда: Люксембург
Репутация: 234
С нами: 12 лет

Сообщение #45 Sumanai » 05.10.2013, 18:31

factotum:Виноват, исправляюсь:

Я вроде выше нарисовал другой способ. Но в яваскрипт ламер. Он хуже?
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #46 factotum » 05.10.2013, 18:37

Sumanai:В смысле моего? Пашет
Было бы здорово добавить логику, исключающую пустые элементы

что-то вроде такого:
Код: Выделить всё
$previewrow = array('message' => $preview_message, 'signature' => $preview_signature, 'signature_uid' => $preview_signature_uid, 'signature_bitfield' => $preview_signature_bitfield );

$previewrow = array_filter($previewrow);

echo json_encode($previewrow);

Добавлено спустя 1 минуту 2 секунды:
Sumanai:Я вроде выше нарисовал другой способ. Но в яваскрипт ламер. Он хуже?
извините. не вижу Вашего JS

Добавлено спустя 3 минуты 14 секунд:
Или нужен весь кусок JS?
factotum
Автор темы
Откуда: Люксембург
Репутация: 234
С нами: 12 лет

Сообщение #47 Sumanai » 05.10.2013, 18:44

factotum:ыло бы здорово добавить логику, исключающую пустые элементы

Ага. А так же подключить минипрофиль.
Я так вижу логику работы- в яваскрипт хардкодим разметку минипрофиля, чтобы с каждой страницей не тягать, разбираем принимаемые данные, формируем HTML и вставляем.
Вот ещё что нашёл, жаль, далеко не везде PHP 5.4 и выше:
echo json_encode($previewrow, JSON_UNESCAPED_UNICODE);
Чтобы не кодировать отправляемые символы, а то размер отправляемых данных увеличивается до 4 раз при кодировании.

Добавлено спустя 2 минуты 3 секунды:
factotum:Или нужен весь кусок JS?

Да вот целиком:
Код: Выделить всё
success:  function(data){
console.log("data:",data) // тут мы уже имеем пропарсенный контент. манипулируем с ним на свое усмотрение
$("#preview") // определяем куда вставить
.html(data.message)  // вставляем полученные данные
}
Просто заменил метод .append на метод .html, который был в предыдущих вариантах. Вроде пашет, и он сам удаляет предыдущее содержимое.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #48 factotum » 05.10.2013, 19:00

Sumanai:echo json_encode($previewrow, JSON_UNESCAPED_UNICODE);
попробуйте функцию phpbb:
Код: Выделить всё
$previewrow = utf8_normalize_nfc($previewrow);
echo json_encode($previewrow);
Sumanai:Просто заменил метод .append на метод .html, который был в предыдущих вариантах. Вроде пашет, и он сам удаляет предыдущее содержимое.
не вижу вопросов, должно работать корректно.
Sumanai:формируем HTML
можно и так, но проще и быстрее сформировать шаблон превью на php, отключив в CSS для ноуда показ: display: none;
негативно отношусь к хардкору в коде независимо от языка. код должен быть читабелен, иначе это кража времени даже при небольшой правке
factotum
Автор темы
Откуда: Люксембург
Репутация: 234
С нами: 12 лет

Сообщение #49 Sumanai » 05.10.2013, 19:08

factotum:попробуйте функцию phpbb:

Не в этом суть. Суть в том, что сама функция json_encode по умолчанию кодирует русские символы в их шестнадцатеричное представление, из- за чего отправляемое сервером сообщение дико распухает. Предложенная мной константа это переопределяет, но работает это только в PHP 5.4 и выше.

factotum:не вижу вопросов, должно работать корректно.

Понятно.

factotum:можно и так, но проще и быстрее сформировать шаблон превью на php

Отдельный шаблон?
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #50 factotum » 05.10.2013, 19:25

Sumanai:Отдельный шаблон?
а чем не подходит вьютопик?
factotum
Автор темы
Откуда: Люксембург
Репутация: 234
С нами: 12 лет

Сообщение #51 Sumanai » 05.10.2013, 19:29

factotum:а чем не подходит вьютопик?

Придётся много чего вырезать перед отсылкой.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #52 factotum » 05.10.2013, 19:31

Sumanai:Вот ещё что нашёл, жаль, далеко не везде PHP 5.4 и выше:
echo json_encode($previewrow, JSON_UNESCAPED_UNICODE);
Чтобы не кодировать отправляемые символы, а то размер отправляемых данных увеличивается до 4 раз при кодировании.
не там ищите :ill:
Код: Выделить всё
header('Content-Type: application/json; charset=utf-8', true);
так будет правильней
factotum
Автор темы
Откуда: Люксембург
Репутация: 234
С нами: 12 лет

Сообщение #53 Sumanai » 05.10.2013, 19:47

factotum:так будет правильней

Это не отменяет кодирование отсылаемого сервером.
Зато нашёл вот такой способ. Если в posting.php (чистый) вставить после // Output page ...
Код: Выделить всё
//Проверяем заголовок, если запрос аякс- отдаём json, если нет- идём дальше
if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) )
{
$template->set_filenames(array(
   'body' => 'posting_preview.html')
);
$template->display('body');
exit;
}
И использовать яваскрипт из первых ваших сообщений, то на выходе получаем готовый HTML блока предпросмотра, со всеми возможными подписями и заголовками сообщения, который остаётся только вставить в блок, который даже скрывать не нужно- пустой div всё равно не видно.
Вот как выглядит:
Картинка удалена за давностью лет
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #54 factotum » 05.10.2013, 20:33

Sumanai, как-то так:
Код: Выделить всё
!function ($) {
   /* Preview */
   $(function(){
      function preview() {
         var form = document.postform
         var formData = new FormData(form)
         formData.append("preview", "")
         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: "html",
            cache: false,
            contentType: false,
            processData: false,
            success:  function(data){
               console.log("data:",data)
               $("#preview").remove() // если есть текущее превью, удаляем
               $(".post:last").after(data) // ищем последний пост и добавляем полученный контент
            }
         })
      }
       
      $(document).on('click', 'input[name=preview]', function(e) {
         e.preventDefault()
         e.stopPropagation()
         preview()
      })
   })
}(window.jQuery)
остается вопрос с кодировкой

Добавлено спустя 3 минуты 23 секунды:
и нужна дополнительная логика, если начало темы и в других случаях, где нет других постов.
Последний раз редактировалось factotum 05.10.2013, 20:40, всего редактировалось 1 раз.
factotum
Автор темы
Откуда: Люксембург
Репутация: 234
С нами: 12 лет

Сообщение #55 Sumanai » 05.10.2013, 20:39

factotum:Sumanai, тогда так:

Ещё бы <hr /> добавить перед постом для его визуального отделения, а так- идеально.
Как я понял, разметка даже не трогается, только яваскрипт файл.

factotum:остается вопрос с кодировкой

А что с ней не так?

Добавлено спустя 3 минуты 23 секунды:
factotum:и нужна дополнительная логика, если начало темы

Тоже об этом подумал.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #56 factotum » 05.10.2013, 20:45

Sumanai:Ещё бы <hr /> добавить перед постом для его визуального отделения, а так- идеально.
CSS:
#preview {
margin-top: 20px;
/* в общем все, что угодно */
}
Sumanai:А что с ней не так?
она живет своей жизнью. не определена
Последний раз редактировалось factotum 05.10.2013, 20:54, всего редактировалось 1 раз.
factotum
Автор темы
Откуда: Люксембург
Репутация: 234
С нами: 12 лет

Сообщение #57 Sumanai » 05.10.2013, 20:51

factotum:CSS:
#preview {

Повлияет и на обычный предпросмотр.

factotum:она живет своей жизнью. не определена

Ответ шлётся в text/html; charset=utf-8 автоматически.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #58 factotum » 05.10.2013, 20:58

Sumanai:Ответ шлётся в text/html; charset=utf-8 автоматически.
Вы это где увидели?)
По мне, кодировку должен определять запрос ajax и хидер в ответе.
в текущей версии запроса данные отдаются в urlencode
получаемые данные просто отдаются "как есть"
в вышей версии кода php заголовок не определятся.
factotum
Автор темы
Откуда: Люксембург
Репутация: 234
С нами: 12 лет

Сообщение #59 Sumanai » 05.10.2013, 21:01

factotum:Вы это где увидели?)

В файрбаге в ответе. Функция $template->display('body'); походу сама проставляет заголовок.
И да, <hr> тоже надо удалять, а то плодится начинают.
Последний раз редактировалось Sumanai 05.10.2013, 21:02, всего редактировалось 1 раз.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #60 factotum » 05.10.2013, 21:02

Sumanai:Повлияет и на обычный предпросмотр.
Пока мы переопределяем кнопку "предпросмотр" везде. откуда у Вас возьмется стандартный предпросмотр?

Добавлено спустя 1 минуту 5 секунд:
Sumanai:$template->display('body'); походу сама проставляет заголовок.
было бы здорово. но гляньте, на всякий случай, что делает эта функция
factotum
Автор темы
Откуда: Люксембург
Репутация: 234
С нами: 12 лет

Пред.След.

Вернуться в Пожелания 1.x



cron