Paradox 3 گزارش دادن ارسال شده در بهمن 1 سلام وقت بخیر من میخام یه بخش تو پنل مدیریت ، قابلیت فعال و غیرفعال کردن منطقه ها رو اضافه کنم از طریق ایجکس استان و شهر و منطقه رو نمایش میدم حالا میخام اگه مثلا شهر تهران انتخاب شد تمام منطقه های مربوط به شهر تهران رو تو دیتابیس غیرفعال کنم یا بالعکس اگه غیرفعال هست بتونم فعال کنم ( میخوام یکجا تمام مناطق باهم فعال و غیرفعال بشن) نمیدونم از طریق ایجکس انجام بدم یا تو کنترلر این بخش گیر کردم برای اینکار یه فیلد به جدول منطقه اضافه کردم $table->tinyInteger('status')->default(1); حالا میخام بگم وقتی استان و شهر انتخاب شد دکمه فعال و غیرفعال سازی منطقه باشه مثل عکس زیر روت ها 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
saber 143 گزارش دادن ارسال شده در بهمن 1 الان مشکلتون این هست که چطوری دکمه های فعال یا غیرفعال رو نمایش بدید؟ چون میخواید بطور کلی مناطق رو فعال یا غیرفعال کنید و مثلا انتخاب یک یا چند منطقه ندارید کار راحتتری هست میتونید موقعی که لیست مناطق رو دریافت میکنید فیلد status رو هم بگیرید و براساس اون توی response بخش ایجکس هر کدوم از دکمه های فعال یا غیرفعال رو نمایش بدید و موقعی که روی دکمه مورد نظر کلیک شد عمل فعال یا غیرفعاسازی رو انجام بدید. نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در بهمن 1 در 13 ساعت قبل، saber گفته است : الان مشکلتون این هست که چطوری دکمه های فعال یا غیرفعال رو نمایش بدید؟ چون میخواید بطور کلی مناطق رو فعال یا غیرفعال کنید و مثلا انتخاب یک یا چند منطقه ندارید کار راحتتری هست میتونید موقعی که لیست مناطق رو دریافت میکنید فیلد status رو هم بگیرید و براساس اون توی response بخش ایجکس هر کدوم از دکمه های فعال یا غیرفعال رو نمایش بدید و موقعی که روی دکمه مورد نظر کلیک شد عمل فعال یا غیرفعاسازی رو انجام بدید. بله تو ایجکس مشکلم اینه چطوری دکمه فعال و غیرفعال status رو نمایش بدم و روش کلیک شد قابلیت فعال و غیرفعال اعمال بشه الان تو کنترلر هم باید تغییری اعمال بشه پس ؟ این چیزی که نوشتم اشتباهه؟ نقل قول Share this post Link to post Share on other sites
saber 143 گزارش دادن ارسال شده در بهمن 1 بخش نمایش دکمه ها مربوط به جیکوئری هست و ارتباطی با لاراول نداره ولی باید توی قسمتی که 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 کردید که این دو تا کار باهم همخوانی ندارن 1 نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در بهمن 1 پس الان فعال یا غیرفعال بودن 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
Paradox 3 گزارش دادن ارسال شده در بهمن 1 الان به این شکل که نوشتم برای نمایش دکمه ها 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
saber 143 گزارش دادن ارسال شده در بهمن 1 برای اینکه status رو توی response ندارید من اون رو برای تست نوشتم و شما باید مقدارش رو از وضعیت مناطق بگیرید و در response همون مقدار رو دریافت و براساس اون دکمه ها رو مخفی یا نمایش بدید نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در بهمن 1 در 18 ساعت قبل، saber گفته است : برای اینکه status رو توی response ندارید من اون رو برای تست نوشتم و شما باید مقدارش رو از وضعیت مناطق بگیرید و در response همون مقدار رو دریافت و براساس اون دکمه ها رو مخفی یا نمایش بدید توسط جیکوئری باز باید اینکارو کرد ؟ چون نمیدونم چطوری اینکارو کنم نقل قول Share this post Link to post Share on other sites
saber 143 گزارش دادن ارسال شده در بهمن 1 چون همه مناطق شما در یه وضعیت هستن و فعال یا غیرفعال هستن توی کنترلر که در متد 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); } 1 نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در بهمن 1 من تو دیتابیس دیفالت رو یک گذاشتم پس اینجا به جای 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
Paradox 3 گزارش دادن ارسال شده در بهمن 1 function manage_region_status(status) { $.ajax({ type:'POST', url:'/admin.send.locations', data: { status // _token: '{{csrf_token()}}' "_token": "{{ csrf_token() }}", }, }); } اینجا مشکل دارم نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در بهمن 1 از کنترلر باید مدیریت بشه درسته ؟ تو این متد که فرم رو دارم اینجا باید ایدی شهر رو بگیرم و بگم استاتوس رو تو جدول منطقه غیرفعال کنه ؟ 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
saber 143 گزارش دادن ارسال شده در اسفند 1 در در ۱۴۰۱/۱۱/۲۸ در 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 هم دیدم دریافت میکنید اون رو هم باید مقدارش رو از فرم بگیرید و توی ایجکس ارسال کنید 1 نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در اسفند 1 در 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
Paradox 3 گزارش دادن ارسال شده در اسفند 1 سلام متاسفانه موفق نشدم این کد ایجکس رو درست کنم به این شکل نوشتم 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