Armin Rahmati
4 سال پیش توسط Armin Rahmati مطرح شد
20 پاسخ

حذف عکس

سلام خدمت دوستان.
کاربر هنگام ثبت ملک علاوه بر مشخصات ملکی که وارد میکند، میتواند ملک خود را بدون عکس ثبت کند یا حداکثر 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"/>

ثبت پرسش جدید
Hossein Rafiee
تخصص : برنامه نویس php
@hossein.rafiee 4 سال پیش مطرح شد
0

برا تصاویر جدول جدا نداری؟


Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
0

@hr80805
خیر به صورت آرایه در فیلد images ذخیره میشن.


Hossein Rafiee
تخصص : برنامه نویس php
@hossein.rafiee 4 سال پیش مطرح شد
0

اصولیش اینه یک جدول دیگه درست کنی برا عکسا رابطه یک به چند و

$images = $this->uploadImages($estate->images);

این آرایه داخل اون سینک کنی
@arminrahmati999


Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
0

@hr80805
اگه بخوام با شرایط فعلی این کارو کنم باید چیکار کنم؟


Hossein Rafiee
تخصص : برنامه نویس php
@hossein.rafiee 4 سال پیش مطرح شد
0

آرایه عکس های قبلی را از دیتابیس بخون با ارایه عکس های جدید مقایسه کن اون ایتمی راکه توی آرایه ای که از دیتابیس هست و ولی توی آرایه جدید نیست را فایلش را حذف کن فایلش را از روی سرور

@arminrahmati999


Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
0

@hr80805
درک این قسمت یکم واسم سخته، امکانش هست کدشو بنویسید؟


Hossein Rafiee
تخصص : برنامه نویس php
@hossein.rafiee 4 سال پیش مطرح شد
0

وقتی ملک را ویرایش میکنه فایل هایی را که قبلا آپلود کرده را دوباره آپلود کرده را دوباره آپلود میکنی چون جایی ندیدم که چک کنی اگه قبلا آپلود شده بود دیگه آپلود نکنی؟


Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
0

@hr80805
منظورتون اینه که اگه مثلا هنگام ثبت دو تا عکس آپلود کرده بود و قسمت ویرایش بدون هیچ تغییری روی دگمه ویرایش کلیک کنه، مجدد اون دو تا عکس آپلود بشن؟ (یعنی بشه 4 تا عکس؟)


Hossein Rafiee
تخصص : برنامه نویس php
@hossein.rafiee 4 سال پیش مطرح شد
0

بله با این کدی که شما نوشتی 2 تا عکس 4 تا نمیشه ولی وقتی ملک را ویرایش میکنه همه عکس ها دوباره آپلود میشه و چون اینجا نام منحصر به فردی برای عکس درست نکردی روی عکس های قبلی باز نویسی میشه چون عکسا باهمون عکسی که از سمت کاربر میاد داری ذخیره میکنید که ای اشتباع است
واگه نام عکس هارا یک رشته رندم بهشون اضافه کنی متوجه میشید که تعداد عکس ها زیاد میشه


Armin Rahmati
@arminrahmati999 4 سال پیش آپدیت شد
0

@hr80805
نام عکسا به این صورت ذخیره میشه

vCFzNEzKdb8QtCAJQXwBuDVUUx5cbcK1SVIIpPYt.jpg

و بعد از ویرایش تغییر نمیکنه.


Hossein Rafiee
تخصص : برنامه نویس php
@hossein.rafiee 4 سال پیش آپدیت شد
0

وقتی فرم ارسال میشه توی تب نتورک ببین همه فایل ها داره دوباره آپلود میشه @arminrahmati999


Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
0

@hr80805
منظورتون اینه تو تب نتورک اسم عکس نوشته شده باشه؟


Hossein Rafiee
تخصص : برنامه نویس php
@hossein.rafiee 4 سال پیش مطرح شد
0

اینسپکت مرورگر را باز کن قسمت نتورک ببین فایل های که قبلا آپلود کردی باز هم آپلود میشه یا نه


Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
Hossein Rafiee
تخصص : برنامه نویس php
@hossein.rafiee 4 سال پیش آپدیت شد
0

از دوقسمت کدت مشکل داره الان دستم بنده اگه تافردا کارت حل نشد تل پیام بده
@arminrahmati999


Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
0

@hr80805
آیدی تلگرامتون چیه؟


Hossein Rafiee
تخصص : برنامه نویس php
@hossein.rafiee 4 سال پیش مطرح شد
Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
0

@hossein.rafiee
هر کاری کردم نشد، تو تلگرام پیام دادم.
@wozniak
@ali.bayat
@mohsenbostan
@hosseinshirinegad98
@mhyeganeh
از بقیه دوستان ممنون میشم راهنمایی کنن.


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
0

سلام
شما باید دقت کنی که فایل رو چطور از اینپوت حذف میکنی؟ اگر فقط در مرورگر و سمت کاربر این کارو انجام میدی و هیچ درخواستی به سرور نمیرود خوب معلومه که اون عکس همچنان در سر جای خودش در سرور باقی هست و فقط در ظاهر سمت کاربر است که حذف صورت گرفته.
شما میتونید در یه گوشه خارج از فرم ویرایش در ویوی ویرایش عکسای اون ملکتو لیست کنی و برای هر کدومشون هم یه دکمه حذف در نظر بگیری و در روت حذف تصویر هم نام هر تصویر به همراه آیدی ملکتو بفرست سمت سرور و اونجا ابتدا ملکتو پیدا کن سپس فیلد تصاویرتو بشکن تبدیل به آرایه کن با نام عکست که پاس داده شده اون آیتمو از لیست تصاویر حذف کن مجدد آرایه رو تبدیل به رشته کن و در فیلد تصاویر ملک ذخیره کن.
این یه روش ساده ای است.


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش آپدیت شد
0

این کد سمت سرورش

 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');

اسم روت و کنترلر خودتو جایگزین روت و کنترلر این روت کن


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام