Как правильно создать форму, в которой есть параметры для заполнения текстовых полей и возможность загрузки изображения? PHP / Laravel - PullRequest
0 голосов
/ 02 апреля 2020

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

Пример формы:

{!! Form::open(['method' => 'POST', 'route' => ['app.json-ld.update']])!!}
    {!! Form::label('name', 'Store name', ['class' => 'form-label']) !!}
    {!! Form::text('name', $shop->jsonLDFields->name ?? '', ['class' => 'form-control']) !!}
    {!! Form::label('url', 'Store url', ['class' => 'form-label']) !!}
    {!! Form::text('url', $shop->jsonLDFields->url ?? '', ['class' => 'form-control']) !!}
    {!! Form::label('description', 'Store Description', ['class' => 'form-label']) !!}
    {!! Form::textarea('description', $shop->jsonLDFields->description ?? '', ['class' => 'form- 
    control form-textarea']) !!}
    {!! Form::label('telephone', 'Phone number', ['class' => 'form-label']) !!}
    {!! Form::text('telephone', $shop->jsonLDFields->telephone ?? '', ['class' => 'form- 
control']) !!}
    {!! Form::label('image', 'Upload store image', ['class' => 'form-label']) !!}
    {!! Form::file('image', (['class' => 'my-1'])) !!}
    <button class="btn btn-success my-2" type="submit">Update</button>
{!! Form::close() !!}

Контроллер:

public function update(Request $request)
{
    $shop = Shop::with('jsonLDFields')->first();

    $shop->jsonLDFields->update([
        'name' => $request->name,
        'url' => $request->url,
        'description' => $request->description,
        'telephone' => $request->telephone
    ]);

    return back();

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

    public function uploadImage(Request $request)
{
    $shop = Shop::with('jsonLDFields')->first();
    $jsonLd = $shop->jsonLDFields;

    if(!$jsonLd) return back();

    $request->validate(['image' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048']);
    $image = $request->image;
    $filename = Str::slug(microtime()) . '.' . $image->getClientOriginalExtension();

    $request->image->move(public_path('images/json-ld/images'), $filename);

    $jsonLd->image = $filename;
    $jsonLd->save();

    return back();
}

Как реализовать опцию загрузки файла изображения в update методе контроллера?

Попытка выполнялась по-разному, но результат был нулевым. Был бы признателен за помощь с решением.

1 Ответ

1 голос
/ 02 апреля 2020

Просто проверьте, есть ли у входного изображения запроса файл: если ($ request-> hasFile ('image')) и если да, то выполните те же шаги, что и в uploadImage ()

public function update(Request $request) 
    $shop = Shop::with('jsonLDFields')->first();

    $updateArray = [
        'name' => $request->name,
        'url' => $request->url,
        'description' => $request->description,
        'telephone' => $request->telephone
    ];

    if($request->hasFile('image')){
        $image = $request->image;
        $filename = Str::slug(microtime()) . '.' . $image->getClientOriginalExtension();

        $request->image->move(public_path('images/json-ld/images'), $filename);

        $updateArray['image'] = $filename;
    }

    $shop->jsonLDFields->update($updateArray);

    return back();
}

Конечно Вы также должны реализовать валидатор ... Но для простого примера это должно работать.

...