Skip to main content

Command Palette

Search for a command to run...

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

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

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

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

More from this blog

We discuss basic routing

বেসিক রাউটিং সফটওয়্যার আর্কিটেকচারে রাউট হচ্ছে মৌলিক উপাদান(Basic Component). রাউট URL(URL = Uniform Resource Locator) থেকে অনুরোধ গ্রহণ করে এবং এপ্লিকেশনকে রিসোর্সের জন্য নির্দেশনা প্রদান করে। লারাভেলের রাউট সমূহ একই সাথে সুবিন্যস্ত করে রাখার জন্য r...

Jun 1, 20233 min read

Visual Studio Code এডিটর কি-বোর্ড শর্টকার্ট

এখন কোডিংয়ের স্পীড হবে রকেটের গতি যদি আপনি ব্লগটি পড়েন এবং শর্টকাট ব্যবহার করেন তাহলে চলুন শুরু করি। Visual Studio Code এডিটর কি-বোর্ড শর্টকার্টঃ MAC ও WINDOWS এর জন্য আলাদা কি-বোর্ড শর্টকাট নিচে দেওয়া হল- Visual Studio Code এর কমান্ড পেলেট কিভাবে ওপ...

Jun 1, 20233 min read
Visual Studio Code এডিটর কি-বোর্ড শর্টকার্ট

WordPress Support Engineer Input Field And Form

আজকে আমরা আলোচনা করব আমাদের WordPress Support Engineer Course এর ক্লাস ২ নিয়ে এবং আমাদের টপিক হলো html input fields. ইনপুট ফিল্ডে বিভিন্ন রকম টাইপ রয়েছে এর মধ্যে default html,html-5,iput type="text" ইত্যাদি। তো চলুন শুরু করি ।প্রথমেই আমরা আলোচনা করব ...

May 7, 20233 min read

Tailwind Css CLI ব্যাক্ষ্যা সহ Install প্রসেস

সবার প্রথমে আমাদের একটা Directory বানাতে হবে। আপনার Project এর নাম দিয়ে একটি Directory বানিয়ে ফেলুন। এরপর যেকোনো একটা Terminal ব্যবহার করে এই Directory তে ঢুকুন। npm install -D tailwindcss autoprefixer vite এই কমান্ড Terminal-এ দিবো। এক্সট্রা হিসেবে...

Apr 3, 20232 min read
Tailwind Css CLI ব্যাক্ষ্যা সহ Install প্রসেস
S

Shikhun Blog

96 posts