سلام
من میخام ثبت نام سایت تو چندین مرحله انجام بشه
و بعضی از فیلد ها تو مرحله اول ضروری نیست و میخام مثلا تو صفحه اول شماره و پسورد تو دیتابیس ذخیره بشه و تو صفحه بعد حالا بعد از دریافت کد اطلاعات دیگه مثلا عکس و ... تو دیتابیس ذخیره بشه
برای طراحیش توی دیتابیس یه جدول 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'));
از نوتیفیکیشن نباید تو این حالت استفاده کنم ؟