سلام خدمت دوستان.
کاربر هنگام ثبت ملک علاوه بر مشخصات ملکی که وارد میکند، میتواند ملک خود را بدون عکس ثبت کند یا حداکثر 3 عکس برای ملک خود انتخاب کند.
حالا فرض کنید در هنگام ثبت ملک، کاربر برای ملک خود 2 عکس انتخاب کرده است و آن را ثبت میکند و در هنگام ویرایش میخواد یکی از اون عکسا رو حذف کند، مشکلی که هست اینه که وقتی من اون 1 عکس رو از input حذف میکنم، از input حذف میشه و وقتی اطلاعات رو ثبت میکنم، عکس همچنان باقی میماند. (اگر عکسی اضافه کنم و ثبت کنم مشکلی نیست و عکس به درستی اضافه میشه ولی مشکل در حذف عکس است که از input حذف میشه ولی از دیتابیس و سرور حذف نمیشه و وقتی مجدد به view ویرایش برمیگردم همچنان عکس در input قرار دارد.)
فانکشن ثبت ملک:
public function store(Request $request)
{
$estateType = $request->input('estateType');
$type = $request->input('type');
$images = $this->uploadImages();
$data = array_merge($request->all(), compact('images'));
// Apartment && Office - Sell
if (in_array($estateType, ['apartment', 'office']) && $type == 'sell') {
if (!$request->filled('rent') && !$request->filled('deposit'))
auth()->user()->estate()->create($data);
return redirect('/UserPanel');
}
}
فانکشن ویرایش ملک:
public function update(Request $request, int $index)
{
$estate = Estate::where('id', $index)->first();
$estateType = $request->input('estateType');
$type = $request->input('type');
$images = $this->uploadImages($estate->images);
$data = array_merge($request->all(), compact('images'));
// Apartment && Office - Sell
if (in_array($estateType, ['apartment', 'office']) && $type == 'sell') {
if (!$request->filled('rent') && !$request->filled('deposit'))
$estate->update($data);
return redirect('/UserPanel');
}
}
فانکشن آپلود عکس:
protected function uploadImages($images = [])
{
$path = 'uploads/estates/' . date('Y');
if (request()->hasFile('images') && $files = request()->file('images')) {
foreach ($files as $file)
$images[] = $file->store($path);
}
return $images;
}
کدهای قسمت ویو:
<input type="file" class="custom-file-input get-img" name="images[]" accept="image/jpeg" id="get-img1" @change="UploadImg"/>
<input type="file" class="custom-file-input get-img" name="images[]" accept="image/jpeg" id="get-img2" @change="UploadImg"/>
<input type="file" class="custom-file-input get-img" name="images[]" accept="image/jpeg" id="get-img3" @change="UploadImg"/>
اصولیش اینه یک جدول دیگه درست کنی برا عکسا رابطه یک به چند و
$images = $this->uploadImages($estate->images);
این آرایه داخل اون سینک کنی
@arminrahmati999
آرایه عکس های قبلی را از دیتابیس بخون با ارایه عکس های جدید مقایسه کن اون ایتمی راکه توی آرایه ای که از دیتابیس هست و ولی توی آرایه جدید نیست را فایلش را حذف کن فایلش را از روی سرور
وقتی ملک را ویرایش میکنه فایل هایی را که قبلا آپلود کرده را دوباره آپلود کرده را دوباره آپلود میکنی چون جایی ندیدم که چک کنی اگه قبلا آپلود شده بود دیگه آپلود نکنی؟
@hr80805
منظورتون اینه که اگه مثلا هنگام ثبت دو تا عکس آپلود کرده بود و قسمت ویرایش بدون هیچ تغییری روی دگمه ویرایش کلیک کنه، مجدد اون دو تا عکس آپلود بشن؟ (یعنی بشه 4 تا عکس؟)
بله با این کدی که شما نوشتی 2 تا عکس 4 تا نمیشه ولی وقتی ملک را ویرایش میکنه همه عکس ها دوباره آپلود میشه و چون اینجا نام منحصر به فردی برای عکس درست نکردی روی عکس های قبلی باز نویسی میشه چون عکسا باهمون عکسی که از سمت کاربر میاد داری ذخیره میکنید که ای اشتباع است
واگه نام عکس هارا یک رشته رندم بهشون اضافه کنی متوجه میشید که تعداد عکس ها زیاد میشه
@hr80805
نام عکسا به این صورت ذخیره میشه
vCFzNEzKdb8QtCAJQXwBuDVUUx5cbcK1SVIIpPYt.jpg
و بعد از ویرایش تغییر نمیکنه.
وقتی فرم ارسال میشه توی تب نتورک ببین همه فایل ها داره دوباره آپلود میشه @arminrahmati999
اینسپکت مرورگر را باز کن قسمت نتورک ببین فایل های که قبلا آپلود کردی باز هم آپلود میشه یا نه
از دوقسمت کدت مشکل داره الان دستم بنده اگه تافردا کارت حل نشد تل پیام بده
@arminrahmati999
@hossein.rafiee
هر کاری کردم نشد، تو تلگرام پیام دادم.
@wozniak
@ali.bayat
@mohsenbostan
@hosseinshirinegad98
@mhyeganeh
از بقیه دوستان ممنون میشم راهنمایی کنن.
سلام
شما باید دقت کنی که فایل رو چطور از اینپوت حذف میکنی؟ اگر فقط در مرورگر و سمت کاربر این کارو انجام میدی و هیچ درخواستی به سرور نمیرود خوب معلومه که اون عکس همچنان در سر جای خودش در سرور باقی هست و فقط در ظاهر سمت کاربر است که حذف صورت گرفته.
شما میتونید در یه گوشه خارج از فرم ویرایش در ویوی ویرایش عکسای اون ملکتو لیست کنی و برای هر کدومشون هم یه دکمه حذف در نظر بگیری و در روت حذف تصویر هم نام هر تصویر به همراه آیدی ملکتو بفرست سمت سرور و اونجا ابتدا ملکتو پیدا کن سپس فیلد تصاویرتو بشکن تبدیل به آرایه کن با نام عکست که پاس داده شده اون آیتمو از لیست تصاویر حذف کن مجدد آرایه رو تبدیل به رشته کن و در فیلد تصاویر ملک ذخیره کن.
این یه روش ساده ای است.
این کد سمت سرورش
public function deleteImage(Request $request)
{
$molk = Molk::find($request->id); // خواندن ملک ویراش شده
$images = explode('|', $molk->images); // رشته تصویر تبدیل به آرایه میشود
if (is_array($images) && count($images) > 0 ) { // برسی اینکه آیا این ملک تصویری دارد
if (isset($images[$request->image])) { // برسی اینکه این تصویر وجود دارد
unset(isset($images[$request->image])); // حذف نام تصویر از رشته
unlink($request->image); // حذف تصویر از پوشه مربوطه
$molk->images = implode('|', $images); // آرایه تصاویر مانده دوباره رشته میشن
$molk->save(); // و در نهایت ذخره
}
}
}
و نمایش تصاویر در ویوی ویرایش
@php
$images = explode('|', $molk->images );
@endphp
@foreach($images as $image)
<div>
<img src="{{url($image)}}" width="200">
<form action="{{url('molk/delete/image')}}" method="post">
@csrf
<input type="hidden" name="id" value="{{$molk->id}}">
<input type="hidden" name="image" value="{{$image}}">
<button type="submit">Delete</button>
</form>
</div>
<hr>
{{-- برای حذف هر تصویر یک فرم با حلقه ایجاد میشه --}}
@endforeach
و روتش
Route::post('molk/delete/image', 'DeleteController@deleteImage');
اسم روت و کنترلر خودتو جایگزین روت و کنترلر این روت کن
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟