ক্লাস নং-২০(টিউটোরিয়াল-পার্ট-৯) Learning management system-laravel

ক্লাস নং-২০(টিউটোরিয়াল-পার্ট-৯) Learning management system-laravel

আজকের ক্লাসেও আমরা আমাদের role & permisson নিয়ে আলোচনা করব।

admisson and payment system.

প্রথমেই আমাদের একটা Controller এবং রাউট তৈরি করতে হবে

    Route::get('/admisson', [AdmissonController::class, 'admisson'])->name('admisson');

এবং আমাদের একটা livewire components লাগবে।

php artisan livewire:make Admisson

এবং আমাদের AdmissonController এ গিয়ে আমাদের ভিউ ফাইল টাকে assign করে দিতে হবে।

resources/view/admisson.blade.php
<x-app-layout>
    <x-slot name="header">
        <h2 class="font-semibold text-xl text-gray-800 leading-tight">
            {{ __('Admission') }}
        </h2>
    </x-slot>

    <div class="py-12">
        <div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
            <div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">
                <div class="p-6 text-gray-900">
                    <livewire:admission />
                </div>
            </div>
        </div>
    </div>
</x-app-layout>

এবং আমাদের navigation file এ আরেকটা মেনু তৈরি করতে হবে।আমাদের dashboard.blade.php file কে কপি করলেই আমরা আমাদের admisson menu টা তৈরি করে ফেলতে পারব।

এবার আমরা livewire এর admmisson.blade.php file এ কোড লিখব।

<div>
    <form wire:submit.prevent="search" class="flex items-center mb-4">
        <input wire:model.lazy="search" type="text" class="lms-input" placeholder="Search" required>
        <div class="ml-4"><button type="submit" class="lms-btn">Search</button></div>
    </form>

    @if(count($leads) > 0)
        <form wire:submit.prevent="admit">
            <div class="mb-4">
                <select wire:model.lay="lead_id" class="lms-input">
                    <option value="">Select lead</option>
                    @foreach($leads as $lead)
                        <option value="{{$lead->id}}">{{$lead->name}} - {{$lead->phone}}</option>
                    @endforeach
                </select>
            </div>

            @if(!empty($lead_id))
                <div class="mb-4">
                    <select wire:change="courseSelected" wire:model.lay="course_id" class="lms-input">
                        <option value="">Select course</option>
                        @foreach($courses as $course)
                            <option value="{{$course->id}}">{{$course->name}}</option>
                        @endforeach
                    </select>
                </div>
            @endif

            @if(!empty($selectedCourse))
                <p class="mb-4">Price: ${{number_format($selectedCourse->price, 2)}}</p>

                <div class="mb-4">
                    <input wire:model.lazy="payment" type="number" step=".01" max="{{number_format($selectedCourse->price, 2)}}" class="lms-input" placeholder="Payment now">
                </div>

                @include('components.wire-loading-btn')
            @endif
        </form>
    @endif
</div>

এখন আমাদের livewire এর controller file এ function গুলো লিখবো।


    public $search;
    public $leads = [];
    public $lead_id;
    public $course_id;
    public $payment;
    public $selectedCourse;

    public function render()
    {
        $courses = Course::all();
        return view('livewire.admission', [
            'courses' => $courses
        ]);
    }

    public function search() {
        $this->leads = Lead::where('name', 'like', '%' . $this->search . '%')
            ->orWhere('email', 'like', '%' . $this->search . '%')
            ->orWhere('phone', 'like', '%' . $this->search . '%')
            ->get();
    }

    public function courseSelected() {
        $this->selectedCourse = Course::findOrFail($this->course_id);
    }

    public function admit() {
        $lead = Lead::findOrFail($this->lead_id);
        $user = User::create([
            'name' => $lead->name,
            'email' => $lead->email,
            'password' => Str::random(8),
        ]);

        $lead->delete();

        $invoice = Invoice::create([
            'due_date' => now()->addDays(7),
            'user_id' => $user->id,
        ]);

        InvoiceItem::create([
            'name' => 'Course: ' . $this->selectedCourse->name,
            'price' => $this->selectedCourse->price,
            'quantity' => 1,
            'invoice_id' => $invoice->id,
        ]);

        $this->selectedCourse->students()->attach($user->id);


        $this->selectedCourse = null;
        $this->course_id = null;
        $this->lead_id = null;
        $this->search = null;
        $this->leads = [];


        flash()->addSuccess('Admission successful');
    }

এই ফাইলের মধ্যে অনেক গুলো কন্ডিশনের কাজ আছে যেগুলো আপনি প্রথম বার দেখেই বুঝে উঠতে পারবেন না তাই ধৈর্য সহকারে বুঝতে হবে ।

একি সাথে এখানে অনেকগুলো কাজ হয়েছে

যেমনঃ-

  • public model make করেছি।যেগুলোতে প্রথমে empty করে রেখেছি।

  • controller এ ভিউ শো করিয়েছি।

  • search functionality add করেছি।

  • selectedCourse variable এ রেখে পরবর্তিতে assign করেছি।

  • admid function make করেছি এবং lead এর আইডি বের করে পরবর্তিতে assign করেছি।

  • এবং আমাদের lead থেকে রিমুভ করেছি admission হবার পরে। invoice make করেছি

  • এবং সেটার ডেট সেট করে দিয়েছি। InvoiceItem make করেছি।

  • পরবর্তিতে আমাদের যে জিনিষগুলো assign করা হয়েছিল সেগুলোকে empty করেছি।

  • এবং ফাইনালি success message দেখিয়েছি।

এখনা আমাদের course এর সাথে students এর কোন relation নেই সুতরাং আমাদের আবার রিলেশন তৈরি করতে হবে ।

এরজন্য প্রথমেই আমাদের ডেটাবেজের create_courses migration file এ নতুন করে একটি pivot table make করতে হবে।

 //pivot table
        Schema::create('course_student', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('course_id');
            $table->unsignedBigInteger('user_id');
            $table->timestamps();

            $table->foreign('course_id')->references('id')->on('courses')->onDelete('cascade');
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        });

এবং আমাদের Course.php model এ একটা রিলেশন তৈরি করতে হবে।

    public function students() {
        return $this->belongsToMany(User::class, 'course_student', 'course_id', 'user_id');
    }

এছাড়াও ডেটাবেজ এ যে column গুলো ছিল না সেগুলো add করা হয়েছে এবং ।যেহেতু আমাদের invoice Directly করা হয়েছে তাই মডেলের মধ্যে fillable property গুলো দেওয়া হয়েছে।

সব গুলো স্টেপ বাই স্টেপ করা হয়েছে এছাড়াও বুঝতে সমস্যা হলে আপনারা ভিডিও টিওটোরিয়াল ফলো করবেন এটার পাশাপাশি এবং আমাদের github repository এর লিংক দেওয়া আছে সেগুলো ফলো করতে পারেন।

ধন্যবাদ।

Happy Learning

Rakibul Islam