одиночное редактирование картинок в админке
Возникла трудность в получении картинок и их дальнейшем редактировании в базе. Опишу весь процес: в методе Findforedit контролера я получаю данные про товар, которые хочу отредактировать. Вот тут возникает проблема. Мне нужно заполнить 2 поля Input: 1 поле - новые данные, 2 поле скрытое - старые данные, для того что бы понимать что редактировать. Но я не знаю как заполнить поля галереи таким методом, что бы я мог обратится к ним отдельно, и поменял только то, что поменял юзер. После того как мне приходит новый запрос с отредактироваными данными во-первых, я не могу к ним обратится, во-вторых, провалидировать. Вот мой метод Findforedit:
public function findforedit($slug)
{
$product = Product::with('brand', 'category', 'galleryPhotos')->whereSlug($slug)->first();
$brands = Brand::all();
$categories = Category::all();
if ($product) {
return view('adminproduct::adminproductedit', compact('product', 'brands', 'categories'));
} else {
return back()
->withErrors('Такого продукта нету')
->withInput();
}
}
вот моя в'юха:
<div class="row" id="gallery_row">
@foreach($product->galleryPhotos as $photo)
<div class="col-md-3 mb-3" >
<img src="{{asset($photo->image)}}" alt="стара фотографія" id="gallery_photo">
<p><input type="file" name="{{$photo->name}}" id="photo_input"></p>
<input type="hidden" value="{{$photo->image}}" name="{{$photo->name}}">
</div>
@endforeach
</div>
это мой метод edit, где происходит все действия, отвечающие за редактирование
public function edit(Request $request, $slug)
{
if ($request->visibility == null) {
$request->visibility = 0;
}
if ($request->hit == null) {
$request->hit = 0;
}
$validator = Validator::make($request->all(), [
'hidden_name' => 'required|min:2|max:255|exists:products,name',
'name' => 'required|min:2|max:255' , ['unique:products,name', Rule::unique('products', 'name')->ignore($request->hidden_name)],
'desc' => 'required|min:2|max:255',
'category_id' => 'required|exists:categories,id',
'brand_id' => 'required|exists:brands,id',
'price' => 'required|integer|min:0',
'hidden_file' => 'required|image|exists:products,file',
'file' => 'required|image', ['unique:products,file', Rule::unique('products', 'file')->ignore($request->hidden_file)],
'hit' => 'nullable|in:0,1',
'visibility' => 'nullable|in:0,1',
],
[
'name.required' => 'Потрібно вказати назву товару',
'name.min:2' => "Замало символів",
'name.max:255' => "Забагато символів",
'name.unique:products,name' => "Такий товар уже є",
'hidden_name.required' => 'Потрібно вказати назву товару',
'hidden_name.min:2' => "Замало символів",
'hidden_name.max:255' => "Забагато символів",
'hidden_name.exists:products,name' => "Такий товар уже є",
'desc.required' => "Потрібно вказати опис товару",
'desc.min:2' => "Замало символів",
'desc.max:255' => "Забагато символів",
'category_id.required' => 'Потрібно вказати категорію товару',
'category_id.exists:categories,id' => 'Не обманиш, хитрий юзер, треба вказати категорію з перечислених',
'brand_id.required' => 'Потрібно вказати бренд товару',
'brand_id.exists:brands,id' => 'Потрібно вказати бренд товару з перечислених',
'price.required' => 'Потрібно вказати ціну товару',
'price.integer' => 'Потрібно вказати ціну товару числом',
'price.min:0' => 'Потрібно вказати додатню ціну товару',
'file.required' => "Обов'язково потрібно завантажити картинку",
'file.image' => "Обов'язково потрібно завантажити саме картинку",
'file.unique:brands,file' => "Така картинка уже є",
'hit.nullable' => "Це не nullable",
'hit.in:0,1' => "Треба вибрати або так, або ні",
'visibility.nullable' => "Це не nullable",
'visibility.in:0,1' => "Треба вибрати або так, або ні",
]);
if ($validator->fails()) {
return back()
->withErrors($validator->getMessageBag()->first())
->withInput();
}
dd('ok');
$strslug = Str::slug($request->name);
$product = Product::whereSlug($slug)->first();
app(Filesystem::class)->delete(public_path($product->file));
Product::updateOrInsert([
'slug' => $slug,
], [
'name' => $request->desc,
'desc' => $request->desc,
'slug' => $strslug,
'category_id' => $request->category_id,
'brand_id' => $request->brand_id,
'price' => $request->price,
'file' => Storage::disk('publicImages')->put('img/products', $request->file),
'hit' => $request->hit,
'visibility' => $request->visibility,
]
);
return redirect()
->route('adminproduct')
->with(['success' => 'Успішно відредаговано']);
}
К сожелению, JS- ом не владею, так что если можна, рассказать варианты решения моей проблемы используя только Laravel. Заранее спасибо!
Ответы (1 шт):
Я бы сделал так - выводим у каждой картинки чекбокс:
Удалить <input type="checkbox" name="delete_file_ids[]" value="{{ $file->id }}"/>.
А в самом конце инпут для добавления новых картинок:
<input type="file" multiple="multiple" name="new_files"/>.
Соотвественно в контроллере:
if ($request->isMethod('POST')) {
foreach ($request->file('new_files') as $newFile) {
// save $newFile
}
foreach ($request->get('delete_file_ids') as $deleteFileId) {
// delete file by $deleteFileId
}
}