эмммммм. вы используете файл из моего архива?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)