راکت

حذف عکس

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"/>
ثبت پرسش جدید

پاسخ‌ها

20
Hossein Rafiee
Hossein Rafiee
@hossein.rafiee

تخصص: برنامه نویس php

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

Armin Rahmati
Armin Rahmati
@arminrahmati999

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

شاید پاسخ شما همین‌جا باشد

Hossein Rafiee
Hossein Rafiee
@hossein.rafiee

تخصص: برنامه نویس php

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

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

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

Armin Rahmati
Armin Rahmati
@arminrahmati999

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

Hossein Rafiee
Hossein Rafiee
@hossein.rafiee

تخصص: برنامه نویس php

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

@arminrahmati999

Armin Rahmati
Armin Rahmati
@arminrahmati999

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

Hossein Rafiee
Hossein Rafiee
@hossein.rafiee

تخصص: برنامه نویس php

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

Armin Rahmati
Armin Rahmati
@arminrahmati999

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

Hossein Rafiee
Hossein Rafiee
@hossein.rafiee

تخصص: برنامه نویس php

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

Armin Rahmati
Armin Rahmati
@arminrahmati999

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

vCFzNEzKdb8QtCAJQXwBuDVUUx5cbcK1SVIIpPYt.jpg

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

Hossein Rafiee
Hossein Rafiee
@hossein.rafiee

تخصص: برنامه نویس php

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

Armin Rahmati
Armin Rahmati
@arminrahmati999

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

Hossein Rafiee
Hossein Rafiee
@hossein.rafiee

تخصص: برنامه نویس php

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

Armin Rahmati
Armin Rahmati
@arminrahmati999
Hossein Rafiee
Hossein Rafiee
@hossein.rafiee

تخصص: برنامه نویس php

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

Armin Rahmati
Armin Rahmati
@arminrahmati999

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

Hossein Rafiee
Hossein Rafiee
@hossein.rafiee

تخصص: برنامه نویس php

Armin Rahmati
Armin Rahmati
@arminrahmati999

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

حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

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

حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

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

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

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

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

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