سلام
من میخام ثبت نام سایت تو چندین مرحله انجام بشه
و بعضی از فیلد ها تو مرحله اول ضروری نیست و میخام مثلا تو صفحه اول شماره و پسورد تو دیتابیس ذخیره بشه و تو صفحه بعد حالا بعد از دریافت کد اطلاعات دیگه مثلا عکس و ... تو دیتابیس ذخیره بشه
برای طراحیش توی دیتابیس یه جدول users زدم و فیلد صفحات بعد رو در ابتدا nullable کردم میخام بدونم این روش درسته یا باید برای هر صفحه جدول جدا بزنم و ریلیشن ایجاد کنم ؟
ایا نمونه ای هست تا ببینم و به شکل درست پیاده سازی کنم ؟
بصورت کلی اگر موجودیتی میخوای ایجاد کنی که همه مواردش تکمیل شده باشه و خارج از چیزی که میخوای نباشه باید فیلد ها nullable نباشه تا در صورت مشکل رکوردی ایجاد نشه .
دو مرحله ای کردن اگر تو 2 تا صفحه باشه ، میتونی اطلاعات صفحه اول رو به صفحه دوم بفرستی و اونجا ثبت نام انجام بشهو
اما اگر میخوای دو مرحله متفاوت داشته باشی ، مثلا الان اسم و شماره تلفن بگیری و هفته بعد چیزای دیگه ، باید فیلد های دیتابیس ات nullable باشن و داخل کد کنترل کنی تا مشکلی بوجود نیاد .
یکی از کار ها اینه که یک فیلدی داشته باشی بابت اینکه ثبت نام تکمیل شده یا نه مثلا completed که میتونه بولین باشه .
یه اینکه یک جدول دیگه داشته باشی بابت اطلاعات تکمیلی و آی دی این جدول رو به جدول کاربر متصل کنی ، اینطوری هر کاربری که آی دی اطلاعات تکمیلی داشته باشه ، میفهمی که اطلاعات تکمیلی وارد کرده و اگر نداشته باشی میفهمی که باید اطلاعات تکمیلی وارد کنه.
@afsharmahmoodian
سلام مجدد
دو مرحله ای کردن اگر تو 2 تا صفحه باشه ، میتونی اطلاعات صفحه اول رو به صفحه دوم بفرستی و اونجا ثبت نام انجام بشهو
ثبت نام من چندین مرحله هست به چه شکل میتونم اطلاعات صفحه اول به صفحه دو م و صفحات دیگه ای که دارم بفرستم ؟
باید از صف استفاده کرد ؟
اما اگر میخوای دو مرحله متفاوت داشته باشی ، مثلا الان اسم و شماره تلفن بگیری و هفته بعد چیزای دیگه ، باید فیلد های دیتابیس ات nullable باشن و داخل کد کنترل کنی تا مشکلی بوجود نیاد .
نه همچین چیزی نمیخوام تمام اطلاعات میخام تکمیل بشه ولی هر اطلاعات در صفحات مختلف
یه اینکه یک جدول دیگه داشته باشی بابت اطلاعات تکمیلی و آی دی این جدول رو به جدول کاربر متصل کنی ، اینطوری هر کاربری که آی دی اطلاعات تکمیلی داشته باشه ، میفهمی که اطلاعات تکمیلی وارد کرده و اگر نداشته باشی میفهمی که باید اطلاعات تکمیلی وارد کنه
فکر میکنم این منطقی تر باشه درسته؟
برای اینکه ثبت نام تو چند صفحه انجام بشه ، هم میشه از جاوا اسکریپت استفاده کرد که یک بخشی از فرم رو در ابتدا نمایش بده و با زدن دکمه ادامه اون بخش hidden بشه و بخش دیگه نمایان بشه و در آخر هم با دکمه سابمیت کل فرم رو به سمت سرور ارسال میکنید .
یا اینکه یک route داشته باشید که قسمت اول فرم رو نمایش بده و با زدن دکمه ادامه به یک route دیگه بره و اطلاعات رو اونجا بصورت get یا post بفرسته ، در route دوم شما یک فرم جدید دارید که اطلاعات تکمیلی رو میگیرید و input هایی با تایپ hidden که مقادیر صفحه قبلی هستند . اینطوری بنظرم جواب بده.
اگر اینکار رو بکنید نیاز نیست چنتا جدول داشته باشید .
نمونه اش رو هم تو ثبت نام با موبایل زیاد دیدیم که اول شماره موبایل گرفته میشه و بعد یک فرم جدید ظاهر میشه که کد تایید میخواد.
@afsharmahmoodian
سلام مجدد ممنون از توضیحاتتون
من این فرم درست کردم که اطلاعات تماس و دریافت کد تو یک form قرار دادم
<div class="form">
<form method="POST" action="{{ route('register') }}">
@csrf
<div class="arrow pt-4">
<a href="">
<i class="fa fa-chevron-left" aria-hidden="true"></i>
</a>
</div>
<div class="tab-content">
<div class="tab-pane fade show active" id="step1">
<div class="lable text-center">
<p class="fw-bold">ثبت نام</p>
</div>
<div class="form-group">
<div class="col-8 m-auto mt-2 mb-3">
<input type="text" class="form-control @error('phone') is-invalid @enderror" placeholder="شماره تماس" name="phone">
@error('phone')
<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">
<input type="password" class="form-control @error('password') is-invalid @enderror" placeholder="رمز عبور" name="password">
@error('password')
<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">
<input type="password" class="form-control @error('password_confirmation') is-invalid @enderror" placeholder="تکرار رمز عبور"id="password-confirm" name="password_confirmation" required autocomplete="new-password">
@error('password_confirmation')
<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">
<input type="text" class="form-control" placeholder="کد معرف (اختیاری)" name="reagent_code">
</div>
</div>
<div class="form-group">
<div class="col-8 m-auto mt-4 mb-3">
<img src="./images/recaptcha.PNG" width="280px" alt="">
</div>
</div>
<div class="button mt-5 nav nav-pills nav-fill justify-content-center" id="nav-tab" role="tablist">
<a id="step2-tab" data-bs-toggle="tab" href="#step2" class="btn-orange mt-3 mb-3" data-enchanter="next">مرحله بعد</a>
</div>
</div>
<div class="tab-pane fade" id="step2">
<div class="lable text-center mt-5">
<p class="fw-bold mt-5 mb-3">
کد ارسال شده به موبایل
<br/>
را وارد نمایید
</p>
</div>
<div class="form-group">
<div class="col-8 m-auto mt-3 mb-3">
<input id="token" type="text" placeholder="کد را وارد نمایید" class="form-control @error('token') is-invalid @enderror" name="token" value="{{ old('token') }}" required autocomplete="token" autofocus>
@error('token')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="button mt-5">
<button type="submit" class="btn-orange mt-5 mb-5" data-enchanter="finish">ثبت نام</button>
</div>
</div>
</div>
</form>
</div>
برای متد رجیستر کنترلر به این شکل نوشتم و نمیدونم به چه شکل باید بنویسم
میخام کل اطلاعات بعد از گرفتن کد تو دیتابیس ذخیره بشه
public function register(Request $request)
{
$data = $request->validate([
'phone' => 'required|unique:users,phone|digits:11|numeric|regex:/[0]{1}[0-9]{10}/',
'password' => ['required', 'string', 'min:8', 'confirmed'],
'reagent_code' => ['nullable' , 'string' , 'max:255' , 'min:3'],
// 'g-recaptcha-response' =>['required' , New Recaptcha],
],
[
'g-recaptcha-response.required' =>'لطفا روی من ربات نیستم کلیک کنید',
]);
if(! $request->session()->has('auth')) {
return redirect(route('register'));
}
$request->session()->reflash();
$request->validate([
'token' => 'required'
]);
if(! $request->session()->has('auth')) {
return redirect(route('register'));
}
$user = User::findOrFail($request->session()->get('auth.user_id'));
$status = ActiveCode::verifyCode($request->token , $user);
if(! $status) {
// alert()->error('کد صحیح نبود');
return redirect(route('auth.login'));
}
if(auth()->loginUsingId($user->id)) {
$user->activeCode()->delete();
User::create([
'phone' => $data['phone'],
'password' => Hash::make($data['password']),
'reagent_code' => $data['reagent_code'],
]);
return redirect('/rule');
}
return redirect(route('register'));
از نوتیفیکیشن نباید تو این حالت استفاده کنم ؟
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟