2016-06-09 6 views
1

Я создаю CRUD-систему в L5.2 и использую Bootstrap Modal для отображения форм. Я использовал BootForms и Laravel Bootstrap Modal Form для проверки форм и отображения сообщений об ошибках внутри Modal без его закрытия.Laravel 5.2 & AJAX - сообщение об успешном завершении после перенаправления

В основном я открываю Добавить/редактировать формы внутри модального на той же странице, валидация формы выполняется внутри Modal, и как только все в порядке, данные вставляются в базу данных, а модальный закрывается. После этого страница обновляется и отображает обновленные данные.

Все работает нормально, за исключением случая успеха. Я не могу показать сообщение об успешном завершении на моей странице.

Ниже мой код:

AJAX

$.ajax({ 
    type: "POST", 
    url: url, 
    data: data, 
    dataType: 'json', 
    cache: false, 
    contentType: contentType, 
    processData: false 

// Response. 
}).always(function(response, status) { 

    // Reset errors. 
    resetModalFormErrors(); 

    // Check for errors. 
    if (response.status == 422) { 
     var errors = $.parseJSON(response.responseText); 

     // Iterate through errors object. 
     $.each(errors, function(field, message) { 
      console.error(field+': '+message); 
      var formGroup = $('[name='+field+']', form).closest('.form-group'); 
      formGroup.addClass('has-error').append('<p class="help-block">'+message+'</p>'); 
     }); 

     // Reset submit. 
     if (submit.is('button')) { 
      submit.html(submitOriginal); 
     } else if (submit.is('input')) { 
      submit.val(submitOriginal); 
     } 

    // If successful, reload. 
    } else { 
     location.reload(); 
    } 
}); 

Контроллер:

public function store(CustomerRequest $request) 
{ 
    Customer::create($request->all()); 

    return redirect('customers') 
     ->with('message', 'New customer added successfully.') 
     ->with('message-type', 'success'); 
} 

Вид: (для отображения сообщения об успешном)

@if(Session::has('message')) 
    <div class="alert alert-{{ Session::get('message-type') }} alert-dismissable"> 
     <button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button> 
     <i class="glyphicon glyphicon-{{ Session::get('message-type') == 'success' ? 'ok' : 'remove'}}"></i> {{ Session::get('message') }} 
    </div> 
@endif 

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

ответ

4

Вы возвращаете перенаправление HTTP из ответа, который не работает с запросами AJAX. Клиент, такой как браузер, сможет перехватывать и потреблять информацию заголовка, которая затем перезагружает страницу.

Вместо этого для вашей конкретной проблемы, рассмотреть следующие вопросы:

https://laravel.com/docs/5.2/session#flash-data

public function store(CustomerRequest $request) 
{ 
    Customer::create($request->all()); 

    $request->session()->flash('message', 'New customer added successfully.'); 
    $request->session()->flash('message-type', 'success'); 

    return response()->json(['status'=>'Hooray']); 
} 

Теперь HTTP/200 OK ответ, полученный вашим AJAX будет выполнять location.reload и мелькали данные сессии будут доступны для просмотра.

+1

Вы спасли мой день, браво. – Jazzbot

+0

Вам всегда нужно возвращать ответ, чтобы поместить данные в сеансы? Потому что я написал только этот фрагмент кода '$ request-> session() -> flash ('message-type', 'success');' и он не работал. Почему это? – shigg

Смежные вопросы