Paradox
2 سال پیش توسط Paradox مطرح شد
4 پاسخ

ثبت نام در چند مرحله

سلام
من میخام ثبت نام سایت تو چندین مرحله انجام بشه
و بعضی از فیلد ها تو مرحله اول ضروری نیست و میخام مثلا تو صفحه اول شماره و پسورد تو دیتابیس ذخیره بشه و تو صفحه بعد حالا بعد از دریافت کد اطلاعات دیگه مثلا عکس و ... تو دیتابیس ذخیره بشه

برای طراحیش توی دیتابیس یه جدول users زدم و فیلد صفحات بعد رو در ابتدا nullable کردم میخام بدونم این روش درسته یا باید برای هر صفحه جدول جدا بزنم و ریلیشن ایجاد کنم ؟

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


ثبت پرسش جدید
افشار محمودیان
تخصص : برنامه نویس
@afsharmahmoodian 2 سال پیش مطرح شد
0

بصورت کلی اگر موجودیتی میخوای ایجاد کنی که همه مواردش تکمیل شده باشه و خارج از چیزی که میخوای نباشه باید فیلد ها nullable نباشه تا در صورت مشکل رکوردی ایجاد نشه .
دو مرحله ای کردن اگر تو 2 تا صفحه باشه ، میتونی اطلاعات صفحه اول رو به صفحه دوم بفرستی و اونجا ثبت نام انجام بشهو
اما اگر میخوای دو مرحله متفاوت داشته باشی ، مثلا الان اسم و شماره تلفن بگیری و هفته بعد چیزای دیگه ، باید فیلد های دیتابیس ات nullable باشن و داخل کد کنترل کنی تا مشکلی بوجود نیاد .
یکی از کار ها اینه که یک فیلدی داشته باشی بابت اینکه ثبت نام تکمیل شده یا نه مثلا completed که میتونه بولین باشه .
یه اینکه یک جدول دیگه داشته باشی بابت اطلاعات تکمیلی و آی دی این جدول رو به جدول کاربر متصل کنی ، اینطوری هر کاربری که آی دی اطلاعات تکمیلی داشته باشه ، میفهمی که اطلاعات تکمیلی وارد کرده و اگر نداشته باشی میفهمی که باید اطلاعات تکمیلی وارد کنه.


Paradox
تخصص : در حال یادگیری
@paradox 2 سال پیش مطرح شد
0

@afsharmahmoodian
سلام مجدد

دو مرحله ای کردن اگر تو 2 تا صفحه باشه ، میتونی اطلاعات صفحه اول رو به صفحه دوم بفرستی و اونجا ثبت نام انجام بشهو

ثبت نام من چندین مرحله هست به چه شکل میتونم اطلاعات صفحه اول به صفحه دو م و صفحات دیگه ای که دارم بفرستم ؟
باید از صف استفاده کرد ؟

اما اگر میخوای دو مرحله متفاوت داشته باشی ، مثلا الان اسم و شماره تلفن بگیری و هفته بعد چیزای دیگه ، باید فیلد های دیتابیس ات nullable باشن و داخل کد کنترل کنی تا مشکلی بوجود نیاد .

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

یه اینکه یک جدول دیگه داشته باشی بابت اطلاعات تکمیلی و آی دی این جدول رو به جدول کاربر متصل کنی ، اینطوری هر کاربری که آی دی اطلاعات تکمیلی داشته باشه ، میفهمی که اطلاعات تکمیلی وارد کرده و اگر نداشته باشی میفهمی که باید اطلاعات تکمیلی وارد کنه

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


افشار محمودیان
تخصص : برنامه نویس
@afsharmahmoodian 2 سال پیش مطرح شد
0

برای اینکه ثبت نام تو چند صفحه انجام بشه ، هم میشه از جاوا اسکریپت استفاده کرد که یک بخشی از فرم رو در ابتدا نمایش بده و با زدن دکمه ادامه اون بخش hidden بشه و بخش دیگه نمایان بشه و در آخر هم با دکمه سابمیت کل فرم رو به سمت سرور ارسال میکنید .
یا اینکه یک route داشته باشید که قسمت اول فرم رو نمایش بده و با زدن دکمه ادامه به یک route دیگه بره و اطلاعات رو اونجا بصورت get یا post بفرسته ، در route دوم شما یک فرم جدید دارید که اطلاعات تکمیلی رو میگیرید و input هایی با تایپ hidden که مقادیر صفحه قبلی هستند . اینطوری بنظرم جواب بده.
اگر اینکار رو بکنید نیاز نیست چنتا جدول داشته باشید .
نمونه اش رو هم تو ثبت نام با موبایل زیاد دیدیم که اول شماره موبایل گرفته میشه و بعد یک فرم جدید ظاهر میشه که کد تایید میخواد.


Paradox
تخصص : در حال یادگیری
@paradox 2 سال پیش آپدیت شد
0

@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'));

از نوتیفیکیشن نباید تو این حالت استفاده کنم ؟


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام