Обновить запись с изображением, используя AJAX в Laravel - PullRequest
0 голосов
/ 24 октября 2019

У меня проблемы с обновлением записи с изображением. Я не знаю, что мне нужно делать. Мое изображение хранится в общедоступной папке с именем «img / products».

Я использую этот метод в моем контроллере для хранения «продукта»

$productImage = $request->file('image');
        $productImageName = rand() . '.' . $productImage->getClientOriginalExtension();
        $productImage->move(public_path('img/products'), $productImageName);

        $products = Product::create([
            'name' => $request->name,
            'category_id' => $request->category_id,
            'description' => $request->description,
            'price_neto' => $request->price_neto,
            'iva' => $request->iva,
            'price_total' => $request->price_total,
            'image' => $productImageName,
        ]);

ProductController.php

В контроллере я больше сомневаюсь, верен мой код или нет.

public function update(Request $request, $id)
    {

        $validator = Validator::make($request->input(), array(
            'name' => 'required',
            'category_id' => 'required',
            'description' => 'required',
            'price_neto' => 'required',
            'iva' => 'required',
            'price_total' => 'required',
            'image' => '',
        ));

        if ($validator->fails()) {
            return response()->json([
                'error'    => true,
                'messages' => $validator->errors(),
            ], 422);
        }

        $products = Product::find($id);

        if ($request->hasFile('image')) {

            $path = public_path("img/products/" . $products->image);

            if(File::exists($path)) {

                File::delete($path);

                $productImage = $request->file('image');
                $productImageName = rand() . '.' . $productImage->getClientOriginalExtension();
                $productImage->move(public_path('img/products'), $productImageName);

                $products->image = $productImageName;
            }
        }

        $products->name = $request->name;
        $products->category_id = $request->category_id;
        $products->description = $request->description;
        $products->price_neto = $request->price_neto;
        $products->iva = $request->iva;
        $products->price_total = $request->price_total;

        $products->save();

        return response()->json([
            'error' => false,
            'products'  => $products,
        ]);
    }

Product.js

$("#btn-edit").click(function() {

        var form = new FormData($("#frmEditProduct")[0]);

        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        });
        $.ajax({
            type: 'PUT',
            url: '/product/' + $("#frmEditProduct input[name=product_id]").val(),
            data: form,
            processData: false,
            contentType: false,
            dataType: 'json',
            success: function(data) {
                $('#frmEditProduct').trigger("reset");
                $("#frmEditProduct .close").click();
                window.location.reload();
            },
            error: function(data) {
                var errors = $.parseJSON(data.responseText);
                $('#edit-product-errors').html('');
                $.each(errors.messages, function(key, value) {
                    $('#edit-product-errors').append('<li>' + value + '</li>');
                });
                $("#edit-error-bag").show();
            }
        });
    });

Маршрут

Route::group(['prefix' => 'product'], function () {
        Route::get('/{id}', [
            'uses' => 'ProductController@show',
            'as'   => 'product.show',
        ]);

        Route::post('/', [
            'uses' => 'ProductController@store',
            'as'   => 'product.store',
        ]);

        Route::put('/{id}', [
            'uses' => 'ProductController@update',
            'as'   => 'product.update',
        ]);

        Route::delete('/{id}', [
            'uses' => 'ProductController@destroy',
            'as'   => 'product.destroy',
        ]);
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...