• SanDev.pro
  •  › 
  • Datalife Engine
  •  › 
  • Псевдо AJAX формы и отображение ошибок без перезагрузки страницы
Псевдо AJAX формы и отображение ошибок без перезагрузки страницы для DLE

Псевдо AJAX формы и отображение ошибок без перезагрузки страницы

Наверняка многие задавались вопросом, как сделать так, чтобы при отправке формы, информация об ошибке отображалась сразу, а не после полной перезагрузки страницы.
По хорошему необходимо переделывать отправку формы на AJAX и писать отдельный обработчик, например как это сделано в feedback.
Однако подобный метод не всегда удобен или излишне сложен в плане реализации. К счастью есть простое решение на JS с помощью костылей, велосипедов и iFrame`ов.
Кто знает, у формы form существует замечательный атрибут target, с помощью которого мы можем указать форме как и куда отправлять данные. В частности можно отправлять данные в определенный iframe.

Сразу хочу предупредить о небольшом минусе этого метода.
На странице с формой будет создан скрытый iframe, с адресом страницы куда будет отправляться форма, зачастую это та же просматриваемая страница. Т.е. по факту мы просто получим в 2 раза большее количество http запросов к странице.

Пример работы можно увидеть на моем сайте в форме авторизации и на странице редактирования профиля.

Установка
В любом подключенном к шаблону JS файле прописать:
var ajax_form_index = 0;
function ajaxFormInfo(title,error){
	HideLoading();
	DLEalert(error,title);
	return false;
}
$.fn.ajaxForm = function(){
	if(!this.length) return false;
	var url = this.attr('action');
	if(!url) url = window.location.href;
	this.attr('target','ajaxForm_'+ajax_form_index);
	this.append('<input type="hidden" name="ajaxForm" value="1" />');
	$('body').append('<iframe src="'+url+'" name="ajaxForm_'+ajax_form_index+'" style="display: none;"></iframe>');
	this.on('submit',ShowLoading);
	ajax_form_index++;
}
$(function(){
	$(".ajax_form_parent").closest('form').ajaxForm();
	$(".ajaxForm").ajaxForm();
})


Открыть файл шаблона info.tpl
Добавить код:
<script>
if(window.top != window.self) window.parent.ajaxFormInfo('{title}','{error}');
</script>


Т.к. в некоторых случаях (успешная авторизация, успешное сохранение настроек в профиле) не отображается тег {info}, необходимо добавить свой вывод сообщения.
Открыть файл engine/modules/main.php
Найти строку:
$tpl->set ( '{info}',  $tpl->result['info'] );

ПЕРЕД ней вставить:
////////////////////////////////////////////////////////////////////////////////
if(isset($_POST['ajaxForm']) AND $_POST['ajaxForm']==1 AND !$tpl->result['info']) msgbox('Информация',"Операция выполнена успешно. Обновите страницу.");
////////////////////////////////////////////////////////////////////////////////



Использование
Если есть доступ к редактированию HTML кода самой формы, то к ней достаточно добавить класс ajaxForm
<form method="post" class="ajaxForm">


На странице редактирования профиля тег form прописан сразу в php файле и вносить изменения туда достаточно неудобно, для таких случаев можно воспользоваться ключевым именем класса ajax_form_parent
Т.е. в любом месте в тегах внутри формы достаточно добавить вышеуказанный класс. Например вот моя первая строка из шаблона userinfo.tpl
<div class="container userbox ajax_form_parent">


На этом все, надеюсь данный метод окажется вам полезным :)

С уважением,
Олег Александрович a.k.a. Sander
Комментарии: (7)
  1. foto
    Посетитель 28 января 2017 16:11 #
    Это конечно хорошо. Но теперь гостям все время вылазят окна "Вы гость и тд и тп" это не есть хорошо. Глаза мозолит.
    0
    1. foto
      Администратор 28 января 2017 16:24 #
      Если и выводит, то это вряд ли проблема именно хака.
      Вот демо, все нормально: http://kino.sandev.pro/
      0
      1. foto
        Посетитель 29 января 2017 19:34 #
        Может просто совпадение, но до этой статьи все было нормально, ни каких окон не выскакивало.
        0
  2. foto
    Гость 26 марта 2020 23:13 #
    Добрый день, подскажите пожалуйста, как сделать чтобы после успешного изменения, авторизации не выводилось окно - if(isset($_POST['ajaxForm']) AND $_POST['ajaxForm']==1 AND !$tpl->result['info']) msgbox('Информация',"Операция выполнена успешно. Обновите страницу.");, а обновлялась страница? А в других случаях оставалась работать как и работает, т.е. алерты в окне? Спасибо)
    0
    1. foto
      Администратор 27 марта 2020 12:16 #
      Я не могу сказать, что этого сделать нельзя. Но нужно вспоминать логику работы, делать, тестировать. Я не хочу этим заниматься.
      0
    2. foto
      Гость 2 июня 2020 17:35 #
      У вас получилось решить ?
      0
  3. foto
    Гость 1 июня 2020 17:52 #
    Скажите пожалуйста а как еще добавить вывод ошибок в формы входа и регистрации
    yadi.sk/i/1-YMlJmtugRclw
    yadi.sk/d/HTeCCVSnVCW1RA
    0
Добавить комментарий

Внимание! Все сообщения касающиеся техподдержки будут удалены или проигнорированы

Attention! All messages asking for technical support will be removed or ignored

  • Логин
  • E-mail (не обязательно)
Повторите рисунок:
antibot
© Sander-Development. 2009-2024.
При копировании, ссылка на источник обязательна.