رفتن به مطلب
انجمن پشتیبانی لاراول ایران

هاست لاراول با پشتیبانی 24 ساعته و امکانات کامل از مدیرهاست

Recommended Posts

سلام وقت بخیر من میخام یه بخش تو پنل مدیریت ، قابلیت فعال و غیرفعال کردن منطقه ها رو اضافه کنم
از طریق ایجکس استان و شهر و منطقه رو نمایش میدم
حالا میخام اگه مثلا شهر تهران انتخاب شد تمام منطقه های مربوط به شهر تهران رو تو دیتابیس غیرفعال کنم یا بالعکس اگه غیرفعال هست بتونم فعال کنم ( میخوام یکجا تمام مناطق باهم فعال و غیرفعال بشن)

نمیدونم از طریق ایجکس انجام بدم یا تو کنترلر این بخش گیر کردم


برای اینکار یه فیلد به جدول منطقه اضافه کردم

            $table->tinyInteger('status')->default(1);

 

حالا میخام بگم وقتی استان و شهر انتخاب شد دکمه فعال و غیرفعال سازی منطقه باشه مثل عکس زیر
 

11_0ky.png

 

روت ها

    Route::get('/locations' , [AdminController::class , 'showLocation'])->name('locations');
    Route::post('/locations/fetch-cities' , [AdminController::class , 'fetchCity']);
    Route::post('/locations/fetch-regions' , [AdminController::class , 'fetchRegion']);
    Route::post('/locations' , [AdminController::class , 'submitLocation'])->name('send.locations');

    Route::get('locations/status/{location}', [AdminController::class ,'updatestatus'])->name('location.status');

 

کنترلر

 public function fetchRegion(Request $request)
    {
        // $data['regions'] = Region::where("city_id", $request->city_id)
        // ->get();

        $data['regions'] = Region::where("city_id", $request->city_id)->whereStatus(1)
        ->get();
          
        return response()->json($data);
    }

    public function submitLocation(Request $request , Region $region)
    {
        $request->validate([
            'province' => 'required',
            'city' => 'required',
            'region' => '',
            'status' => ''
        ]);
        
        if (Region::where('city_id', $request->city)->count() > 0)
        {
            if ($request->region[0] == 'all') {

                $region = Region::where('city_id', $request->city)->get();
                // auth()->user()->regions()->sync($region);

                $region = Region::updated([
                    'status' => 0
                ]);

            } else {

                $region = Region::findOrFail($request->region);
                auth()->user()->regions()->sync($region);
            }

        } else {
            return redirect(route('locations'));
        }

        return redirect(route('locations'));
        
    }

فرم بلید

   <form method="POST" action="{{ route('send.locations') }}">
                            @csrf
                            <div class="form-group">
                                <div class="col-8 m-auto mt-3 mb-3">
                                    <select id="province-dropdown" name="province" class="form-select @error('province') is-invalid @enderror">
                                        <option class="d-none">استان</option>
                                            @foreach ($provinces as $province)
                                                <option value="{{ $province->id }}">{{ $province->name }}</option>
                                            @endforeach
                                    </select>
                                    @error('province')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                    @enderror
            
                                </div>
                            </div>
            
                            <div class="form-group">
                                <div class="col-8 m-auto mt-3 mb-3">
                                    <select id="city-dropdown" name="city" class="form-select @error('city') is-invalid @enderror">
                                        <option class="d-none disabled">شهر</option>
                                    </select>
                                    @error('city')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                    @enderror
                                </div>
                            </div>
            
                            <div class="form-group">
                                <div class="col-8 m-auto mt-3 mb-5">
                                    <select id="region-dropdown" name="region" class="form-select select @error('region') is-invalid @enderror">
                                        <option class="d-none">منطقه</option>
                                    </select>
                                    @error('region')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                    @enderror
                                </div>
                            </div>
                            
                            <div class="button mt-5 text-center">
                                <button type="submit" class="btn btn-info">ثبت</button>
                            </div>
            
                            
                        </form>

کدهای ایجکس

 $(document).ready(function () {

        $('#province-dropdown').on('change', function () {
            var idProvince = this.value;
            $("#city-dropdown").html('');
            $.ajax({
                url: "{{url('admin/locations/fetch-cities')}}",
                type: "POST",
                data: {
                    province_id: idProvince,
                    _token: '{{csrf_token()}}'
                },
                dataType: 'json',
                success: function (result) {
                    $('#city-dropdown').html('<option value=""> انتخاب شهر </option>');
                    $.each(result.cities, function (key, value) {
                        $("#city-dropdown").append('<option value="' + value
                            .id + '">' + value.name + '</option>');
                    });
                    $('#region-dropdown').html('<option value="">انتخاب منطقه</option>');
                }
            });
        });

        $('#city-dropdown').on('change', function () {
            var idCity = this.value;
            $("#region-dropdown").html('');
            $.ajax({
                url: "{{url('admin/locations/fetch-regions')}}",
                type: "POST",
                data: {
                    city_id: idCity,
                    _token: '{{csrf_token()}}'
                },
                dataType: 'json',
                success: function (res) {
                    $('#region-dropdown').html('<option value="all">تمام مناطق</option>');

 

Share this post


Link to post
Share on other sites

الان مشکلتون این هست که چطوری دکمه های فعال یا غیرفعال رو نمایش بدید؟ چون میخواید بطور کلی مناطق رو فعال یا غیرفعال کنید و مثلا انتخاب یک یا چند منطقه ندارید کار راحتتری هست میتونید موقعی که لیست مناطق رو دریافت میکنید فیلد status رو هم بگیرید و براساس اون توی response بخش ایجکس هر کدوم از دکمه های فعال یا غیرفعال رو نمایش بدید و موقعی که روی دکمه مورد نظر کلیک شد عمل فعال یا غیرفعاسازی رو انجام بدید.

Share this post


Link to post
Share on other sites
در 13 ساعت قبل، saber گفته است :

الان مشکلتون این هست که چطوری دکمه های فعال یا غیرفعال رو نمایش بدید؟ چون میخواید بطور کلی مناطق رو فعال یا غیرفعال کنید و مثلا انتخاب یک یا چند منطقه ندارید کار راحتتری هست میتونید موقعی که لیست مناطق رو دریافت میکنید فیلد status رو هم بگیرید و براساس اون توی response بخش ایجکس هر کدوم از دکمه های فعال یا غیرفعال رو نمایش بدید و موقعی که روی دکمه مورد نظر کلیک شد عمل فعال یا غیرفعاسازی رو انجام بدید.

بله تو ایجکس مشکلم اینه چطوری دکمه فعال و غیرفعال status رو نمایش بدم و روش کلیک شد قابلیت فعال و غیرفعال اعمال بشه

الان تو کنترلر هم باید تغییری اعمال بشه پس ؟ این چیزی که نوشتم اشتباهه؟

Share this post


Link to post
Share on other sites

بخش نمایش دکمه ها مربوط به جیکوئری هست و ارتباطی با لاراول نداره ولی باید توی قسمتی که response مناطق رو دریافت میکنید status رو هم دریافت کنید و براساس او از متدهای show و hide توی جیکوئری میتونید استفاده کنید مثلا دو تا دکمه دارید که پیشفرض مخفی هستن و نمایش داده نمیشن وقتی response مناطق رو دریافت کردید اگه از قبل فعال بودن دکمه غیرفعال رو نمایش میدید یه چیزی شبیه کد زیر:

<button type="submit" style="display: none" id="enable_region" onclick="manage_region_status(1)">فعال</button>
<button type="submit" style="display: none" id="disable_region" onclick="manage_region_status(0)">غیرفعال</button>

<script>

    $('#city-dropdown').on('change', function () {
        var idCity = this.value;
        $("#region-dropdown").html('');
        $.ajax({
            url: "{{url('admin/locations/fetch-regions')}}",
            type: "POST",
            data: {
                city_id: idCity,
                _token: '{{csrf_token()}}'
            },
            dataType: 'json',
            success: function (res) {
                $('#region-dropdown').html('<option value="all">تمام مناطق</option>');
                // اینجا وضعیت رو چک میکنید و براساس اون دکمه مورد نظر رو نمایش میدید
                if(res.status)
                {
                    $('#enable_region').hide();
                    $('#disable_region').show();
                }else{
                    $('#enable_region').show();
                    $('#disable_region').hide();
                }

            }
        })
    })
    
    function manage_region_status(status)
    {
        // فرم رو اینجا ارسال میکنید
    }

</script>

در مورد کنترلر هم متوجه کارتون نشدم توی متد submitLocation در شرط اول مناطق رو غیرفعال کردید و در صورتی که شرط برقرار نیست با جدول کاربران sync کردید که این دو تا کار باهم همخوانی ندارن

Share this post


Link to post
Share on other sites

پس الان فعال یا غیرفعال بودن status رو دیگه نباید با لاراول ارسال کنم درسته ؟

با جیکوئری انجام بدم ؟

یعنی اون متد submitLocation  رو نیازی بهش نیست ؟

توسط این متد 

manage_region_status 

باید status رو با جیکوئری صفر یا یک کنم ؟

 

من قبلا به این شکل انجام میدادم تو لاراول

if ($region->status == 1) {
            $region->status = 0;
        } else {
            $region->status = 1;
        }

        $region->save();

تو جیکوئری نمیدونم به چه شکل میشه اینکارو کرد 

Share this post


Link to post
Share on other sites

الان به این شکل که نوشتم برای نمایش دکمه ها

    if(res.status)
                    {
                        $('#enable_region').hide();
                        $('#disable_region').show();
                    }else{
                        $('#enable_region').show();
                        $('#disable_region').hide();
                    }

چه مناطق فعال باشه چه غیرفعال دکمه فعال رو نمایش میده بعد از انتخاب منطقه 

این متد برای نمایش منطقه مشکلی نداره ؟

    public function fetchRegion(Request $request)
    {
         $data['regions'] = Region::where("city_id", $request->city_id)->get();
          
        return response()->json($data);
    }

 

Share this post


Link to post
Share on other sites

برای اینکه status رو توی response ندارید من اون رو برای تست نوشتم و شما باید مقدارش رو از وضعیت مناطق بگیرید و در response همون مقدار رو دریافت و براساس اون دکمه ها رو مخفی یا نمایش بدید

Share this post


Link to post
Share on other sites
در 18 ساعت قبل، saber گفته است :

برای اینکه status رو توی response ندارید من اون رو برای تست نوشتم و شما باید مقدارش رو از وضعیت مناطق بگیرید و در response همون مقدار رو دریافت و براساس اون دکمه ها رو مخفی یا نمایش بدید

توسط جیکوئری باز باید اینکارو کرد ؟

چون نمیدونم چطوری اینکارو کنم

Share this post


Link to post
Share on other sites

چون همه مناطق شما در یه وضعیت هستن و فعال یا غیرفعال هستن توی کنترلر که در متد fetchRegion مناطق رو دریافت میکنید status رو اونجا چک کنید و توی response که برگشت میدید یه فیلد با اسم status قرار بدید و مقدارش رو برابر با وضعیت مناطق دریافتی قرار بدید بعدشم که در بخش جیکوئری با پاسخی که ایجکس دریافت کرده دکمه ها رو مدیریت کنید. مشابه کد زیر میتونید status رو پاس بدید

 

   public function fetchRegion(Request $request)
    {
         $data['regions'] = Region::where("city_id", $request->city_id)->get();
          $data['status'] = $data['regions'][0]->status; // دقیقا مطابق با فیلدی که در دیتابیس هست مقدار رو دریافت کنید
        return response()->json($data);
    }

 

Share this post


Link to post
Share on other sites

من تو دیتابیس دیفالت رو یک گذاشتم پس اینجا به جای 0 باید یک رو قرار بدم درسته ؟

در در ۱۴۰۱/۱۱/۲۳ در 21:00، saber گفته است :

چون همه مناطق شما در یه وضعیت هستن و فعال یا غیرفعال هستن توی کنترلر که در متد fetchRegion مناطق رو دریافت میکنید status رو اونجا چک کنید و توی response که برگشت میدید یه فیلد با اسم status قرار بدید و مقدارش رو برابر با وضعیت مناطق دریافتی قرار بدید بعدشم که در بخش جیکوئری با پاسخی که ایجکس دریافت کرده دکمه ها رو مدیریت کنید. مشابه کد زیر میتونید status رو پاس بدید

 


   public function fetchRegion(Request $request)
    {
         $data['regions'] = Region::where("city_id", $request->city_id)->get();
          $data['status'] = $data['regions'][0]->status; // دقیقا مطابق با فیلدی که در دیتابیس هست مقدار رو دریافت کنید
        return response()->json($data);
    }

 

و اینکه تو این متد تو جی اس من درخواست رو نتونستم ارسال کنم این بخش نمیدونم دقیقا 

    function manage_region_status(status)
    {
        // فرم رو اینجا ارسال میکنید
    }

 

Share this post


Link to post
Share on other sites

از کنترلر باید مدیریت بشه درسته ؟

تو این متد که فرم رو دارم

اینجا باید ایدی شهر رو بگیرم و بگم استاتوس رو تو جدول منطقه غیرفعال کنه ؟

    public function submitLocation(Request $request , Region $region)
    {
       
        if($request->region[0] == 'all')
        {
            $region = Region::where('city_id', $request->city)->get();
            $region = Region::updated([
                'status' => 0
            ]);
        }
}

 

Share this post


Link to post
Share on other sites
در در ۱۴۰۱/۱۱/۲۸ در 11:50، Paradox گفته است :

    function manage_region_status(status)
        {
            $.ajax({
                type:'POST',
                url:'/admin.send.locations',
                data: {
                    status
                    // _token: '{{csrf_token()}}'
                    "_token": "{{ csrf_token() }}",
 
                },
 
            });
        }

اینجا مشکل دارم

اینقسمت باید id شهری رو که انتخاب شده از طریق جیکوئری دریافت کنید و با نام city به کنترلر ارسال کنید چون توی کنترلر دیدم با نام city دریافت میکنید به شکل زیر

function manage_region_status(status)
{
  let city = $('#city_input_id_add_here').val();
  $.ajax({
    type:'POST',
    url:"{{ route('your route name') }}"
    data: {
    "_token": "{{ csrf_token() }}",
    status: status,
    city: city

  },

});
}

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

Share this post


Link to post
Share on other sites
در 12 ساعت قبل، saber گفته است :

اینقسمت باید id شهری رو که انتخاب شده از طریق جیکوئری دریافت کنید و با نام city به کنترلر ارسال کنید چون توی کنترلر دیدم با نام city دریافت میکنید به شکل زیر


function manage_region_status(status)
{
  let city = $('#city_input_id_add_here').val();
  $.ajax({
    type:'POST',
    url:"{{ route('your route name') }}"
    data: {
    "_token": "{{ csrf_token() }}",
    status: status,
    city: city

  },

});
}

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

all رو باید تو این متد بالا بزارم ؟ به این شکل تعریف کنم

                    $('#region-dropdown').html('<option value="all">تمام مناطق</option>');

یا این شکل؟ ایجکس بلد نیستم 

        let city = $('all').val();

 

این کدهای کنترلرم اشتباهه ؟ 

    public function submitLocation(Request $request , Region $region)
    {
 
        if($request->region[0] == 'all')
        {
            $region = Region::where('city_id', $request->city)->get();

            if ($region->status == 1) {
                $region->status = 0;
            } else {
                $region->status = 1;
            }
    
            $region->save();

            // $region->status = 0;
            // $region->save();

            // $region = Region::update([
            //     'status' => 0
            // ]);

            // DB::table('regions')
            // ->where('id','=',$region)
            // ->update([
            //     'status'=>'0',
            // ]);
        }
        
            // if ($request->region[0] == 'all') {

            //     $region = Region::where('city_id', $request->city)->get();
            //     // auth()->user()->regions()->sync($region);

            //     $region = Region::updated([
            //         'status' => 0
            //     ]);

            // } else {

            //     $region = Region::findOrFail($request->region);
            //     // auth()->user()->regions()->sync($region);
            //     $region = Region::updated([
            //         'status' => 1
            //     ]);
            // }


        return redirect(route('locations'));
        
    }

 

Share this post


Link to post
Share on other sites

سلام متاسفانه موفق نشدم این کد ایجکس رو درست کنم

به این شکل نوشتم

    function manage_region_status(status)
    {

        let city = $('#city-dropdown').val();
            $.ajax({
            type:'POST',
            url:"{{ route('disable-regions') }}"
            data: {
                _token: "{{ csrf_token() }}",
                city_id : city
            },
            success: function(data) {
                console.log(data);
            },
            error: function(error) {
                console.log(error);
            }
        });
        // let city = $('#city-dropdown').val();
        // $.ajax({
        //     type:'POST',
        //     url:"{{ route('admin.send.locations') }}"
        //     data: {
        //     "_token": "{{ csrf_token() }}",
        //     status: status,
        //     city: city
        //     },
        // });
    }

 

روت 

    Route::post('/disable-regions' , [AdminController::class , 'disableRegions'])->name('disable-regions');

 

توی کنترلر که دیگه نیازی نداره کوئری باشه درسته ؟

 

این هم بلید

<button type="button" style="display: none" id="enable_region"  class="btn btn-info">فعال</button>
 <button type="button" style="display: none" id="disable_region" class="btn btn-danger">غیرفعال</button>

اصلا درخواست ارسال نمیشه به دیتابیس

Share this post


Link to post
Share on other sites

وارد این گفتگو شوید

میتوانید پیام خود را ارسال کنید و بعد ثبت نام نمایید. در صورتی که حساب کاربری دارید, هم اکنون وارد شوید و در این گفتگو شرکت کنید.

مهمان
پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  Only 75 emoji are allowed.

×   لینک شما به صورت اتوماتیک جایگذاری شد.   نمایش به عنوان یک لینک به جای

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • جدید...