ajax post preview

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

Описание: Только готовые решения! Статьи, заметки, моды и другие полезности для phpBBex 1.x и phpBB 3.0.x.
Модератор: Поддержка

Сообщение #1 Dr.Death » 08.11.2014, 14:24

Если кто хочет превью поста через ajax можно попробовать такую штуку
Код: Выделить всё
   $('#postform input[name="preview"]').off('click').on('click', function() {
      var previewButton = $(this);
      if(previewButton.hasClass('sending')) return false;

      if($('#postform input[name="form_token"]').val() == 0) {
         var formScript = $('input[name="form_token"]').next('script').text();
         if(formScript) {
            $('#postform input[name="creation_time"]').val(formScript.match(/\.val\('(\d{10})'\)/)[1]);
            $('#postform input[name="form_token"]').val(formScript.match(/\.val\('([a-z0-9]{32,})'\)/)[1]);
         }
      }

      $.ajax({
         type: 'POST',
         url: $('#postform').attr('action'),
         data: $('#postform').serialize() + '&preview=1',
           beforeSend: function() {
            $('#preview').remove();
            previewButton.addClass('sending');
           },
         success: function(data) {
            error = $(data).find('#postingbox p.error').first();
            preview = $(data).find('#preview').first();
            if(error.length) {
               previewButton.parents('.panel').after($('<div id="preview">' + error.wrap('<div>').parent().html() + '</div>'));
            }
            else if (preview.length) {
               previewButton.parents('.panel').after(preview);
               $('#preview .postbody').css('width', '100%');
               $("#preview").find('script').each(function() {
                  eval($(this).text());
               });
            }
            previewButton.removeClass('sending');
         }
      });
      return false;
   });
С гостями и капчей не работает без доработок!
Последний раз редактировалось Dr.Death 08.11.2014, 22:22, всего редактировалось 5 раз(а).
Dr.Death M
Автор темы
Аватара
Репутация: 69
С нами: 9 лет 8 месяцев

Сообщение #2 factotum » 08.11.2014, 18:41

/viewtopic.php?t=752
Можно объединить темы.
factotum
Откуда: Люксембург
Репутация: 234
С нами: 11 лет 11 месяцев

Сообщение #3 Dr.Death » 08.11.2014, 19:26

тут нет обработок bbcode :smile:
Dr.Death M
Автор темы
Аватара
Репутация: 69
С нами: 9 лет 8 месяцев

Сообщение #4 Sumanai » 08.11.2014, 20:02

В 3.1 в расширении для БО всё уже есть. Нужно просто допилить напильником.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #5 Dr.Death » 08.11.2014, 20:05

Ну я себе пока так допилил, чтоб сильно не ковыряться :smile:
Dr.Death M
Автор темы
Аватара
Репутация: 69
С нами: 9 лет 8 месяцев

Сообщение #6 factotum » 08.11.2014, 20:05

Dr.Death:тут нет обработок bbcode
Как это нет?
Код: Выделить всё
url: $('#postform').attr('action'),
         data: $('#postform').serialize() + '&preview=1',
Превью запрашивается через стандартный обработчик. ББ-код должны парсится стандартными средствами. Или Ваш первью не показывает ни смайлы, ни обработанные бб-код?
factotum
Откуда: Люксембург
Репутация: 234
С нами: 11 лет 11 месяцев

Сообщение #7 Dr.Death » 08.11.2014, 20:08

нет сторонней обработки, тупо парсинг страницы превью
Dr.Death M
Автор темы
Аватара
Репутация: 69
С нами: 9 лет 8 месяцев

Сообщение #8 factotum » 08.11.2014, 20:48

Dr.Death:нет сторонней обработки, тупо парсинг страницы превью
Ок. Гляньте код этого: /viewtopic.php?p=8374#p8374
Давно писал и не припомню особенностей, но говорю о том, что и Ваш скрипт, и мой, делают одно и тоже. Разница в адресе обращения, и может быть, в работе для гостей. Превью для Гостей проверяли, работает?
factotum
Откуда: Люксембург
Репутация: 234
С нами: 11 лет 11 месяцев

Сообщение #9 Dr.Death » 08.11.2014, 20:52

Не проверял, но моему должно быть все равно откуда (хоть личные сообщения) и кто шлет :wink:

Добавлено спустя 8 минут 17 секунд:
Хотя не, капча меняется и пишет "Ошибка отправки формы. Попробуйте ещё раз." :biggrin: Впрочем гостей у меня нет, поэтому все равно :toothless:

Добавлено спустя 3 минуты 50 секунд:
А ну да, там на субмит висит прописка токенов в форму...

Добавлено спустя 12 минут 21 секунду:
Допилил.... С каптчей не разбирался...
Dr.Death M
Автор темы
Аватара
Репутация: 69
С нами: 9 лет 8 месяцев

Сообщение #10 factotum » 08.11.2014, 21:42

Dr.Death:$('#postform input[name="preview"]').off('click').on('click', function() {
есть трезвое объяснение зачем выключаете обработчик событий?
Dr.Death:if(previewButton.hasClass('sending')) return false;
тут просто выйти из функции.
Dr.Death:previewButton.parents('.panel').after(preview);
parent('.panel') будет немного быстрее
Dr.Death:return false;
правильней в обработчик событий .on('click', function(e) { добавить e.stopPropagation.

$.post сократит размер кода.

Добавлено спустя 3 минуты 36 секунд:
и если можно, добавьте скрин консоли, где виден заголовок ответа сервера по "превью" и целостность передачи данных? Для теста лучше сообщение подлиннее. Строк на 10-20.
factotum
Откуда: Люксембург
Репутация: 234
С нами: 11 лет 11 месяцев

Сообщение #11 Dr.Death » 08.11.2014, 22:01

factotum:есть трезвое объяснение зачем выключаете обработчик событий?
Нет, на всякий случай :D
factotum:parent('.panel') будет немного быстрее
учитывая, что ниче не вернет - да :biggrin:
factotum:правильней в обработчик событий .on('click', function(e) { добавить e.stopPropagation.
мне так нравится
factotum:$.post сократит размер кода.
пофигу
factotum:и если можно, добавьте скрин консоли, где виден заголовок ответа сервера по "превью" и целостность передачи данных? Для теста лучше сообщение подлиннее. Строк на 10-20.
обычный код всей страницы превью

капчу победил отрубив проверку для аякса... но это зло, могут заспамить :D
Код: Выделить всё
   
function isAjax() {
    return isset($_SERVER['HTTP_X_REQUESTED_WITH']) and mb_strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
}

captcha_abstract.php
function validate()
   {
      // dr.death
      // captcha ajax check skip
      if(isAjax() and isset($_POST['preview'])) return false;
Учитывая запрет гостям постить, пофигуууууууу
Последний раз редактировалось Dr.Death 08.11.2014, 22:06, всего редактировалось 1 раз.
Dr.Death M
Автор темы
Аватара
Репутация: 69
С нами: 9 лет 8 месяцев

Сообщение #12 factotum » 08.11.2014, 22:04

понятно.
factotum
Откуда: Люксембург
Репутация: 234
С нами: 11 лет 11 месяцев

Сообщение #13 Dr.Death » 08.11.2014, 22:10

Как вариант можно докрутить так...
Код: Выделить всё
if(isAjax() and isset($_POST['preview']) and isset($_POST['message']) and !isset($_POST['post'])) return false;
+100500 к безопасности :toothless:

В общем меня на конкретно взятом форуме с его настройками все устраивает :oops:
Dr.Death M
Автор темы
Аватара
Репутация: 69
С нами: 9 лет 8 месяцев


Вернуться в Мастерская 1.x



cron