سلام وقت بخیر من یک سیستم عضویت ویژه ایجاد کردم و الان برای ارسال فقط مبلغ پلن که کابر انتخاب میکنه به صفحه Controller مشکل دارم
<form _ngcontent-c13="" action="{{route('vip.payment',['user'=>auth()->user()->id])}}" method="post"
enctype="multipart/form-data"
class="wi-100 flex-col al-start jus-center ng-untouched ng-pristine ng-valid"
novalidate="">
{{csrf_field()}}
@include('errors.errors')
<div _ngcontent-c13="" class="section wi-100 flex-row jus-start al-start">
<div _ngcontent-c13="" class="right-side">
<h4 _ngcontent-c13="" class="ng-tns-c13-4">شارژ عضویت ویژه</h4>
</div>
<div _ngcontent-c13="" class="left-side">
<select name="plan" id="plan">
@foreach ($vips as $vip)
<option value="{{$vip->month}}">{{$vip->name}} - </option>
@endforeach
</select>
<input type="hidden" id="price" name="price" value="1000">
<div _ngcontent-c13="" class="action-section flex-row wi-100"
style="align-self: flex-end;">
<button _ngcontent-c13="" type="submit" class="applyBtn">افزایش عضویت
ویژه
</button>
</div>
</div>
</div>
</form>
تا اینجا پلن ها ای که ایجاد کردم رو برام نمایش میده
و من برای اینکه تست کنم مبلغ رو بصورت دستی خودم وارد کردم در input hidden اما چطوری باید بگم که اگر مثلا پلن یک ماه رو انتخاب کرد که مقدار value اون پلن میشه 1 بیا و مبلغ اون پلن رو هم همراهش ارسال کن
جدول من در پایگاه داده به اینصورت است :
id
name
price
month
در صفحه کنترلر هم به اینصورت قراردادم و درست کار میکنه
public function VipPayment()
{
$this->validate(request(), [
'plan' => 'required'
]);
switch (\request('plan')) {
case 1: //یک ماه
$price = (\request('price'));
break;
case 2: //دو ماه
$price = (\request('price'));
break;
case 3: //سه ماه
$price = (\request('price'));
break;
case 4: //چهار ماه
$price = (\request('price'));
break;
case 5: //پنج ماه
$price = (\request('price'));
break;
case 6: //شش ماه
$price = (\request('price'));
break;
case 7: //هفت ماه
$price = (\request('price'));
break;
case 8: //هشت ماه
$price = (\request('price'));
break;
case 9: //نه ماه
$price = (\request('price'));
break;
case 10: //ده ماه
$price = (\request('price'));
break;
case 11: //یازده ماه
$price = (\request('price'));
break;
case 12: //دوازده ماه
$price = (\request('price'));
break;
}
درود بر شما
هیچ وقت مبلغ رو از کاربر نمیگیرین
یه جای تو config یا دیتابیس فرقی نداره مبالغ رو ذخیره بفرمایید و اسم پلنها رو به کاربر نمایش بدید کاربر پلن رو میفرسته و بر اساسش قیمتها مشخص میشه همین
نه جایی از کاربر قیمت گرفته نمیشه من پلن رو به کاربر نمایش میدم و هر پلن شامل قیمت - ماه - عنوان هست
من یک تگ select قرار دادم و مقدار value اون رو ماه پلن قرار دادم که ارسال بشه به صفحه controller و در اونجا با استفاده از switch بین ماه ها میگردم و هر ماه که مربوط به پلن انتخابی کاربر بود همونجا switch اوکی میشه اما مقدار قیمت رو چطوری در controller جایی که نوشتم
$price = (\request('price'));
قرار بدم من الان دارم بهش میگم مبلغ رو از یک input hidden بخونه اما چطوری باید همراه با پلن انتخابی مبلغ هم اونجا قرار بدم
@mani.h1990 سلام.
کاری که شما میخواید بکنید منطق اشتباهی داره چرا ؟ چون همونطور که آقای موسوی گفتن اینکه مبلغ رو بخواین از سمت کاربر بگیرید کار اشتباهیه.اگر سمت بک اند نیاید و اعتبار سنجی کنید کاربر میتونه توی اون فیلد مخفی هر قیمتی وارد بکنه .
مورد اول : switch-case شما تحت هر شرایطی داره price رو ذخیره میکنه . یعنی براش مهم نیست Case چی هست در همه حالات کار یکسانی میکنه پس نیازی به switch-case ندارید.
مورد دوم : برای کاری که شما مدنظرتون هست میتونید با جاوااسکریپت مشخص کنید که کاربر وقتی پلن رو انتخاب کرد مبلغش توی hidden input قرار بگیره بجای value اما همونطور که گفتم کاربر میتونه تغییرش بده و اگر سمت بک اند چک نکنید بسیار مشکل ساز خواهد بود .
مسیر صحیح: شما بیاید پلن هارو که مثلا مدیر میتونه تغییر بده توی دیتابیس ذخیره کنید ( از کانفیگ یا حتی از فایل هم میتونید بخونید). حالا کاربر فقط اسم پلن ها رو میبینه و وقتی پلنی رو انتخاب میکنه تعداد ماهش توی اینپوت شما ذخیره میشه و سمت بک اند توی کنترلر دریافت میکنید . اونموقع تازه وقت چک کردن هست که آیا پلن 4 ماهه که value 4 رو داره ارسال میکنه برای ما در دیتابیس یا فایلی که اطلاعات پلن هارو داخلش ذخیره کردید وجود داره ؟ اگر داره قیمتش رو میخونید و کاربر رو با همون قیمت میفرستید واسه پرداخت. ( منظور آقای موسوی هم همین روش بود )
نکته کلیدی اینجاست که : هیچگاه به اطلاعاتی که از فرانت میاد اعتماد نکنید
موفق باشید.
من مبلغ رو نمیخوام از سمت کاربر بگیرم من اطلاعات رو در دیتابیس ذخیره کردم و در سمت کاربر دارم با استفاده از حلقه در تگ select نمایش میدم
<select name="plan" id="plan">
@foreach ($vips as $vip)
<option value="{{$vip->month}}">{{$vip->name}} - </option>
@endforeach
</select>
ببینید من نام پلن به همراه ماه و حتی قیمت رو از دیتابیس دارم میخونم
و در قسمت option تگ select مقدار value رو ماه پلن قراردادم
اما توی صفحه کنترلر نمیدونم چطوری باید مبلغ رو قراربدم
برای همین تگ hidden input قرار دادم و مقدار name رو گذاشتم price و مقدار value رو هم دستی بهش دادم تا در صفحه کنترلر بتونم مقدار قیمت رو داشته باشم ( این کار من اشتباه هست و دنبال راه درستش هستم )
@mani.h1990 آهان .
واسه این مورد شما درخواست کاربر که میاد سمت کنترلرتون ماه پلنتونو دارید . به اینصورت با کوئری از دیتابیس دریافتش کنید :
$planMonth = request('plan'); // e.g. 4
$plan = Vip::whereMonth($planMonth)->get(); // plan
$planPrice = $plan->price; // price
اینجا مدل پلن هاتون رو Vip فرض کردم و ستون مربوط به ماه ها رو month
ممنونم @SobhanDadkhah
با دستوری که شما نوشتید که هرکاری کردم درست نشد
و اومدم در قسمت plan بجای اینکه مقدار ماه رو ارسال کنم مقدار ID اون پلن رو ارسال کردم و در صفحه کنترلر به اینصورت دریافت کردم
$planId = request('plan');
$plan = Vip::findOrFail($planId);
$planPrice = $plan->price;
$planMonth = $plan->month;
و اینطوری مقدار های ماه و مبلغ رو بهش دسترسی پیدا کردم و در قسمت switch ازش استفاده کردم
البته نمیدونم این کار من درست بود یا نه ولی مشکل رو برطرف کرد
ممنونم از دوستان بابت کمک
@mani.h1990 بله راه منم به همین صورت هست که باید نوع پلنتون رو از دیتابیس واکشی کنید . برا این مورد که میفرمایید نشد برای اطلاعات بیشتر توضیح میدم خدمتتون . در لاراول برای کوئری اگر شرط where رو بخواین ست کنید به این صورت هست :
Model::where('column_name' , 'operator' , 'valueToSearch');
برای حالتی که من عرض کردم بستگی داره چطوری توی دیتابیس ذخیره کردین مثلا فرض کنید تعداد ماه رو توی ستونی به نام month بصورت عدد 4 ذخیره کردین . کوئری که باهاش میشه اطالاعات گرفت به اینصورته :
Model::where('month' , '=' , 4);
خلاصه شده همین حالت میشه بصورت زیر :
Model::whereMonth(4);
فقط توضیحات اضافه بود . خوشحالم مشکلتون حل شده موفق باشید
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟