Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 19.06.2016 12:51:37

BMTHP

Отправка формы при помощи аякса

При отправке формы аяксом, отправляется сама форма,а я хочу что бы вернулся json и отобразились ошибки. В чем проблема?

<script type="text/javascript">
        $('#form').on('submit', function() {
            var form = $("#form");
            $.ajax({
                url     : form.attr("action"),
                type    : form.attr("method"),
                data    : form,
                dataType: 'json',
                success: function(){

                },
                error :function( errors ) {
                    alert += "<div class='alert alert-danger'><ul>";
                    $.each(errors, function(index, error){
                        alert += "<li> + error + </li>";
                    });
                    alert += "</ul></div>";
                    $('#append').html(alert);
                    console.log(errors);
                }
            })
        })
    </script>

#2 19.06.2016 12:53:24

Re: Отправка формы при помощи аякса

Аякс*
Вопрос задал не корректно.
Форма отправляется аяксом. Json возвращается, но всеравно произходит редирект, как при обычной отправке формы. Подозреваю, что валидатор отправляет не правильный хедер, сделал в валидаторе проверку

if($request->ajax() || $request->wantJson())
{
    // Тут отправка json
}

Изменено BMTH (19.06.2016 13:00:32)

Не в сети

#3 20.06.2016 00:04:37

Cheshirrski
masterМастер
Откуда: Днепр
Сообщений: 116
Статей: 2

Re: Отправка формы при помощи аякса

Покажите что в контроллере, для success должно быть что-то вроде

PHP
public function postCreate(Create $request) {
  
//действия в котроллере
  
return response()->json([
    
'message' => 'Ok',
  ]);
}

Для error — если вы используете стандартный подход в Laravel с Requests, при правильном ajax-запросе должны получить Status Code:422 и json с ошибками

Не в сети

#4 20.06.2016 09:22:34

Re: Отправка формы при помощи аякса

Cheshirrski пишет:

}%Покажите что в контроллере, для success должно быть что-то вроде
%%(php)
public function postCreate(Create $request) {
  //действия в котроллере
  return response()->json([
    'message' => 'Ok',
  ]);
}
%%
Для error - если вы используете стандартный подход в Laravel с Requests, при правильном ajax-запросе должны получить Status Code:422 и json с ошибками

Почти все получилось, методом проб и ошибок. Но теперь почимуто не происходит редирект после успешного добавления в базу.

<script type="text/javascript">
        $('#form').on('submit', function(e) {
            e.preventDefault();
            var form = $("#form");
            var formData = {
                'meta_title': $('input[name=meta_title]').val(),
                'meta_description': $('input[name=meta_description]').val(),
                'meta_keywords': $('input[name=meta_keywords]').val(),
                'name'      : $('input[name=name]').val(),
                'slug'      : $('input[name=slug]').val()
            };
            $.ajax({
                url     : form.attr("action"),
                type    : form.attr("method"),
                data    : formData,
                dataType: 'json',
                headers: {
                    'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content')
                },
                error :function( errors ) {
                    output = "<div class='alert alert-danger'><ul>";
                    $.each(errors.responseJSON, function(index, error){
                        output += "<li>" + error + "</li>";
                    });
                    output += "</ul></div>";
                    $('#append').html(output);
                    console.log(errors);
                },
                success: function(data){
                    output = "<div class='alert alert-success'><ul>";
                    $.each(data.responseJSON, function(index, success){
                        output += "<li>" + success + "</li>";
                    });
                    output += "</ul></div>";
                    $('#append').html(output);
                    console.log(data);
                    window.location = '{{ url('user') }}';
                }
            })
        })
    </script>

Даже если саксесс функция будит пустая,а в валидаторе возвращать буду редирект, всеравно он не происходит почему то.

 public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'name' => 'required|unique:catalogs',
            'slug' => 'required'
        ]);
        if($validator->fails())
        {
            return response()->json($validator->messages(), 422);
        }
        User::create($request->all());
        return response()->json(['success' => 'Все успешно добавлено. Вы будите перенаправлены!'], 422);
    }

Вот что в консоле

jquery.min.js:4 POST http://test.app/user 422 (Unprocessable Entity)send @ jquery.min.js:4ajax @ jquery.min.js:4(anonymous function) @ create:217dispatch @ jquery.min.js:3r.handle @ jquery.min.js:3
create:232 Object {readyState: 4, responseText: "{"success":"\u0412\u0441\u0435 \u0443\u0441\u043f\…043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b!"}", responseJSON: Object, status: 422, statusText: "Unprocessable Entity"}

И почему то, сообщение об успешного добавления высвечивается в денджер алерте

Изменено BMTH (20.06.2016 09:29:57)

Не в сети

#5 20.06.2016 10:52:05

Cheshirrski
masterМастер
Откуда: Днепр
Сообщений: 116
Статей: 2

Re: Отправка формы при помощи аякса

Вы при success возвращаете Status Code:422, нужно 200.

Не в сети

#6 20.06.2016 11:55:39

Re: Отправка формы при помощи аякса

Cheshirrski пишет:

}%Вы при success возвращаете Status Code:422, нужно 200.

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

$('#img').on('change',function(){
            var image = $(this).val();
            $.ajax({
                url: '{{ url('api/img/upload') }}',
                type: 'post',
                data: image,
                headers: {
                    'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content')
                },
                success: function(data){
                    console.log(data);
                },
                error: function(error){
                    console.log(error);
                }
            });
        })

Код контроллера

public function uploadImg(Request $request)
    {
        if($request->hasFile('img'))
        {
            $image = $request->input('img');
            $filename  = str_replace('-','_',rand(111,99999) . '_' . strtolower(str_random(5)) . '.' . $image->getClientOriginalExtension());
            $path = public_path('upload/img/' . $filename);
            Img::make($image->getRealPath())->save($path);
            if($filename)
            {
                $upload_img = new Image();
                $upload_img->url = '/upload/img/' . $filename;
                $upload_img->save();
                return response()->json($filename);
            }
        }
    }

Не в сети

#7 20.06.2016 13:40:43

Cheshirrski
masterМастер
Откуда: Днепр
Сообщений: 116
Статей: 2

Re: Отправка формы при помощи аякса

В форме enctype="multipart/form-data" прописан?

Не в сети

#8 20.06.2016 14:32:26

Re: Отправка формы при помощи аякса

Cheshirrski пишет:

}%В форме enctype="multipart/form-data" прописан?

Да, я уже все перепроверял...

Не в сети

#9 20.06.2016 15:16:43

Cheshirrski
masterМастер
Откуда: Днепр
Сообщений: 116
Статей: 2

Re: Отправка формы при помощи аякса

Нужно как-то так:

$('#img').on('change',function(){
            var form = document.forms.form;
            var formData = new FormData(form);
            $.ajax({
                url: '{{ url('api/img/upload') }}',
                type: 'post',
                data: formData,
                headers: {
                    'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content')
                },
                success: function(data){
                    console.log(data);
                },
                error: function(error){
                    console.log(error);
                }
            });
        })

Не в сети

#10 20.06.2016 18:19:41

Re: Отправка формы при помощи аякса

Нет, не выходит. Кучу всего перепробовал....
А нет ли способа без аякса залить изображение в другую таблицу при добавлен пользователя?

Не в сети

#11 28.06.2016 17:35:08

Re: Отправка формы при помощи аякса

BMTH пишет:

Нет, не выходит. Кучу всего перепробовал....
А нет ли способа без аякса залить изображение в другую таблицу при добавлен пользователя?

Думаю Вам поможет это https://laravel.ru/docs/v5/eloquent-relationships. Если я правильно понял, у Вас как-то модель изображений должна быть связана с другими моделями, которые будут использовать изображения. В выше приведенном разделе документации указан самый удобный способ (способы).

Не в сети

#12 28.06.2016 18:04:39

Re: Отправка формы при помощи аякса

max_kp пишет:
BMTH пишет:

Нет, не выходит. Кучу всего перепробовал....
А нет ли способа без аякса залить изображение в другую таблицу при добавлен пользователя?

Думаю Вам поможет это https://laravel.ru/docs/v5/eloquent-relationships. Если я правильно понял, у Вас как-то модель изображений должна быть связана с другими моделями, которые будут использовать изображения. В выше приведенном разделе документации указан самый удобный способ (способы).

Со связями проблем нет. Проблема в отправке значения input type file, которое не отправляется

Не в сети

#13 29.06.2016 01:04:16

Re: Отправка формы при помощи аякса

BMTH пишет:
max_kp пишет:
BMTH пишет:

Нет, не выходит. Кучу всего перепробовал....
А нет ли способа без аякса залить изображение в другую таблицу при добавлен пользователя?

Думаю Вам поможет это https://laravel.ru/docs/v5/eloquent-relationships. Если я правильно понял, у Вас как-то модель изображений должна быть связана с другими моделями, которые будут использовать изображения. В выше приведенном разделе документации указан самый удобный способ (способы).

Со связями проблем нет. Проблема в отправке значения input type file, которое не отправляется

В документации загрузка файла на сервер описана вот так (смотрю версию 5.2):
$request->file('photo')->move($destinationPath);
$request->file('photo')->move($destinationPath, $fileName);
У Вас в методе public function uploadImg(Request $request) этого нет. Получается Вы не загружаете сам файл на сервер в каталог.

Не в сети

#14 29.06.2016 01:23:50

Re: Отправка формы при помощи аякса

И еще у Вас в коде $image = $request->input('img'); А нужно $image = $request->file('img');

Не в сети

Подвал раздела