Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.01.2012, 14:15
Новичок на форуме
Отправить личное сообщение для alia Посмотреть профиль Найти все сообщения от alia
 
Регистрация: 14.01.2012
Сообщений: 5

Juery-UI modal dialog и неясности
Здравствуйте.
Ситуация такая:
вызываю модальный диалог в который грузится другая страничка(форма)
в общем файле скриптов написана функция(универсально для диалогов)
function showUrlInDialog(url, title){
  var tag = $("<div></div>");
  $.ajax({
    url: url,
    success: function(data) {
      tag.html(data).dialog({modal: true,width: 'auto', title: title }).dialog('open');
    }
  });
}

Со странички вызывается как
<a onclick="showUrlInDialog('/user/register/', 'Регистрация'); return false;" href=#>


Скажите пожалуйста как мне в случае ошибки в форме- вернуть ошибки ajax'ом в этот же диалог без его закрытия. Если форма забита правильно- она закрывается. Но если есть ошибка- форма открывается во весь экран.
Незнаю, правильно ли объяснила..
Подскажите как ошибки отображать в этом же окне диалога.

Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 14.01.2012, 22:19
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

Всё что я пока вижу из кода, это то что при нажатии кнопки регистрации, у вас появится форма в модальном окне. Об остальном ваш код не говорит нечего. говоря словами Линукса Торвальдса - Слова ничто, покажите мне код )))

Короче суть задачи в полной мере не ясна. Толи у вас уже есть отправка формы по ajax толи нет, толи вы уже принимаете данные о результатах валидации, то ли только хотите принимать. Вы хотите/ уже принимаете коды ошибок (в формате json к примеру), или в случае ошибки принимаете готовый хтмл код который заменит содержимое диалога. Как называется плагин с диалогом которым вы пользуетесь и т.д.

что касается доступа к содержимому контейнера модального окна.
В большинстве плагинов переменная tag. не будет указывать на содержимое открытого окна.
Если отсутствуют штатные средства по управлению содержимого диалога, а плагин модифицировать не хочется или не можется . То как вариант попробуй создать именованный контейнер внутри окна, чтобы затем к нему обращаться.
function showUrlInDialog(url, title){
  var tag = $("<div></div>");
  $.ajax({
    url: url,
    success: function(data) {
      tag.html("<div id='myWin'>"+data+"</div>").dialog({modal: true,width: 'auto', title: title }).dialog('open');
    }
  });
}
.................
// теперь где то там далеко меняем содержимое диалогового окна.
$("#myWin").html ("Кажется ваш коврик прохудился ");
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 14.01.2012 в 22:50.
Ответить с цитированием
  #3 (permalink)  
Старый 15.01.2012, 19:28
Новичок на форуме
Отправить личное сообщение для alia Посмотреть профиль Найти все сообщения от alia
 
Регистрация: 14.01.2012
Сообщений: 5

Я извиняюсь если чтото неточно написала.
Плагин- Модальный диалог Jquery-UI. Да, по нажатию кнопки всплывает окно, куда грузится форма. Отправка формы не аяксом, простой submit.
Если форма правильно заполнена- идет отправка и окно закрывается, все хорошо.
Но если в форме ошибки, то эта форма открывается с ошибками на весь экран, а хочется в случае ошибки показывать в этом же всплывшем окне.
То есть в случае ошибки надо принимать html который заменит содержимое модального диалога.
Объяснила как смогла...
Ответить с цитированием
  #4 (permalink)  
Старый 15.01.2012, 22:52
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

Ну я как смог понять так и отвечаю )))
Форму придётся передовать используя асинхронный запрос методом get
По задумке должно проканать для любой cms


//создадим диалог до открытия (необязательно)
//просто создание диалога только ради открытия, это ни совсем верная практика
var tag = $("<div></div>");
tag.dialog({modal: true,width: 'auto', title: title })

// ваш метод
function showUrlInDialog(url, title){

  $.ajax({
    url: url,
    success: function(data) {
      tag.html(data).dialog('open');
      tag.find("mySubmit").click(function(){
          sendForm(tag,"#myForm","test.php");
          return false; 
      })   

    }
  });
}

//sendForm сериализует форму и отправляет её асинхронным запросом
// негативный результат отображает в окне, а в случае удачи окно закрывает

function sendForm(win,form,url){
      //get или post вам нужен я не знаю, я пример для get написал
      // метод по get запросу передаёт сериализованную форму и ждёт ответа
      $.get(url+"?"+$(form).serialize(),function(data){

           // давайте условимся если есть ошибки то сервер вернёт нам   следующий код 
           // <div class="errorLog"> тут наши ошибки </div> 
           // причём этот код может находится внутри 
           // другого кода, скрипту должно бытль паралельно
           // Конечно вы необязаны применять $(data), если вы можете вернуть страницу только с ошибками без стороннего кода,  
           // то возвращайте только её, и работайте с data напрямую

            // достанем содержимое элемента с классом .errorLog из data
            var errLog=$(data).find(".errorLog").html();  

            // если в errLog есть что-то, это значит есть ошибки
            if (errLog.length>0){
                //установим текст в диалог 
                //tag-указывающий на диалоговое окно должен быть доступен    
                // в вашем примере tag это локальная переменная и вне функции showUrlInDialog  она будет недоступна.   
                win.html (errLog);
           }         
            // если всё отлично и errorlog пустой тогда закрываем окно
           else {  
               win.dialog('close');
           }            
      })       
}


За отсутствие ошибок в коде не ручаюсь, основная задача была донести идею.
Ещё есть плагин ajaxForm , думаю его тоже можно приспособить.
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 16.01.2012 в 00:43.
Ответить с цитированием
  #5 (permalink)  
Старый 16.01.2012, 04:40
Новичок на форуме
Отправить личное сообщение для alia Посмотреть профиль Найти все сообщения от alia
 
Регистрация: 14.01.2012
Сообщений: 5

Спасибо большое. Вы правильно направление подсказали.
Вот такой у меня окончательный вариант получился(c учетом что теперь ответ приходит в JSON):
function showUrlInDialog(url, title){
  var tag = $("<div></div>");
  $.ajax({
    url: url,
    success: function(data) {
      tag.html(data).dialog({modal: true,
        buttons     : {
            Ok: function() {
		$.post(url, $("#f").serialize(),function(datar) {
		    $("#f").find('.error').remove();
		    if (datar.success == true) { tag.html(data).dialog('close'); } 
		    else { display_form_errors(datar['data'], $('#f'));}
	    });
            },
            Cancel: function() {
                tag.html(data).dialog('close');
                return false;
            }
        },      
      width: 'auto', title: title }).dialog('open');
    }
  });
}

function display_form_errors(errors, $form) {
    for (var k in errors) {
        $form.find('input[name=' + k + ']').after('<div class="error">' + errors[k] + '</div>');
    }
}


Вот только последнее непонятное осталось- почему когда форму так вызываешь один раз и закрываешь- если вызвать еще раз - уже прилетающие в JSON ошибки не отображаются.

Последний раз редактировалось alia, 16.01.2012 в 05:04.
Ответить с цитированием
  #6 (permalink)  
Старый 16.01.2012, 14:32
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

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

2) мне кажется в обработчике cancel, html(data) лишний.
__________________
Лучше калымить в гандурасе чем гандурасить на колыме
Ответить с цитированием
  #7 (permalink)  
Старый 16.01.2012, 14:36
Новичок на форуме
Отправить личное сообщение для alia Посмотреть профиль Найти все сообщения от alia
 
Регистрация: 14.01.2012
Сообщений: 5

C destroy пробовала. Любопытно что открыв форму в диалоге и закрыв ее и открыв еще раз- при нажатии на Ок(послать)- в консоли видно что никакие данные из формы не отправляются кроме crsf-токена и captcha. Форма постится, но данный не передаются. При первом открытии все красиво.
Пришлось дописать после уничтожения диалога window.location.reload(), тогда повторное открытие(для пользователя) выглядит правильно. В форме jquery не подгружается, проблема непонятной остается почему повторный вызов не работает как надо.

html(data) с обработчика убрала, да работает и без него нормально.

Последний раз редактировалось alia, 16.01.2012 в 15:17.
Ответить с цитированием
  #8 (permalink)  
Старый 16.01.2012, 16:19
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

в порядке эксперемента
вместо доступа к форме по $("#f")
попробуйте tag.find(#f)

Просто такое ощущение, что у тебя несколько обьектов с идентификатором #f в dom появляется.

Это предположение конечно только. К сожалению сейчас смотреть исходники виджета, времени особо нет.
Чтобы проверить это предположение по простому.
в html к элементу c id #f добавте ещё класс test,
а при закрытии или открытии окна считайте сколько элементов с классом test у вас в дум. Если при открытии окна количество увеличивается, тогда считайте что проблему обнаружили. Ещё отладчиком в браузере думаю можно тупо посмотреть что с html происходит )))
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 16.01.2012 в 17:56.
Ответить с цитированием
  #9 (permalink)  
Старый 16.01.2012, 18:04
Новичок на форуме
Отправить личное сообщение для alia Посмотреть профиль Найти все сообщения от alia
 
Регистрация: 14.01.2012
Сообщений: 5

Вы абсолютно правы. При уничтожении диалога #f не убирается с DOM.
Вот исправленный вариант:
function showUrlInDialog(url, title){
  var tag = $("<div></div>");
  $.ajax({
    url: url,
    success: function(data) {
      tag.html(data).dialog({modal: true,
        buttons     : {
            Ok: function() {
		$.post(url, $("#f").serialize(),function(datar) {
		$("#f").find('.error').remove();
		if (datar.success == true) {
		    tag.dialog('destroy');
            	    $("#f").remove();
		    window.location.reload(); }
		else { display_form_errors(datar['data'], $('#f'));}
	    });
            },
            Cancel: function() {
                tag.dialog('destroy');
                $("#f").remove();
                return false;
            }
        },      
      width: 'auto', title: title }).dialog('open');
    }
  });
}

function display_form_errors(errors, $form) {
    for (var k in errors) {
        $form.find('input[name=' + k + ']').after('<div class="error">' + errors[k] + '</div>');
    }
}


Спасибо за ценные наводки.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с Dialog. Блокировка элементов формы Vitus jQuery 1 28.02.2011 10:17
jQuery dialog и ajax. Ошибка helm2004 jQuery 0 18.02.2010 18:35