Laravel 10/9 livewire form wizard example; Through this tutorial, i am going to show you how to make multi step form or form wizard using livewire package in Laravel 10/9 apps.
Laravel 10/9 Livewire Wizard Form Tutorial with Example
Follow the below given steps to create multi step form or form wizard using livewire in Laravel 10/9 apps:
- Step 1: Install Laravel 10/9 App
- Step 2: Configure App to Database
- Step 3: Create Model & Migration For File using Artisan
- Step 4: Install Livewire Package
- Step 5: Create Form Wizard Components using Artisan
- Step 6: Add Route For Livewire Form Wizard
- Step 7: Create View File
- Step 8: Run Development Server
Step 1: Install Laravel 10/9 App
Run following command on command prompt to install laravel fresh app for laravel livewire form wizard or multi-step form app:
composer create-project --prefer-dist laravel/laravel blog
Step 2: Configure App to Database
To configure database credentials in the .env file. So open your project root directory and find .env file. Then add database detail in .env file:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=here your database name here DB_USERNAME=here database username here DB_PASSWORD=here database password here
Step 3: Create Model & Migration For File using Artisan
Run the following command on command prompt to generate model and migration file:
php artisan make:model Product -m
This command will create one model name Product.php and also create one migration that name create_products_table.php.
Go to database/migrations folder and open create_products_table.php file. Then update the following code into create_products_table.php file:
public function up() { Schema::create('products', function (Blueprint $table) { $table->id(); $table->string('name')->nullable(); $table->longText('description')->nullable(); $table->float('amount')->nullable(); $table->boolean('status')->default(0); $table->integer('stock')->default(0); $table->timestamps(); }); }
Run the following command on command prompt to create the table into your database:
php artisan migrate
To add the fillable properties in App/Models/Product.php file:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Product extends Model { use HasFactory; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'amount', 'description', 'status', 'stock' ]; }
Step 4: Install Livewire Package
Run the following command on command prompt to install livewire package to your laravel app:
composer require livewire/livewire
Step 5: Create Form Wizard Components using Artisan
Run the following command on command prompt to create the livewire components for creating a livewire form wizard component:
php artisan make:livewire wizard
This command will create the following components on the following path:
app/Http/Livewire/Wizard.php resources/views/livewire/wizard.php
Go to app/Http/Livewire folder and open Wizard.php file. Then add the following code into your Wizard.php file:
<?php namespace App\Http\Livewire; use Livewire\Component; use App\Models\Product; class Wizard extends Component { public $currentStep = 1; public $name, $amount, $description, $status = 1, $stock; public $successMessage = ''; /** * Write code on Method * * @return response() */ public function render() { return view('livewire.wizard'); } /** * Write code on Method * * @return response() */ public function firstStepSubmit() { $validatedData = $this->validate([ 'name' => 'required|unique:products', 'amount' => 'required|numeric', 'description' => 'required', ]); $this->currentStep = 2; } /** * Write code on Method * * @return response() */ public function secondStepSubmit() { $validatedData = $this->validate([ 'stock' => 'required', 'status' => 'required', ]); $this->currentStep = 3; } /** * Write code on Method * * @return response() */ public function submitForm() { Product::create([ 'name' => $this->name, 'amount' => $this->amount, 'description' => $this->description, 'stock' => $this->stock, 'status' => $this->status, ]); $this->successMessage = 'Product Created Successfully.'; $this->clearForm(); $this->currentStep = 1; } /** * Write code on Method * * @return response() */ public function back($step) { $this->currentStep = $step; } /** * Write code on Method * * @return response() */ public function clearForm() { $this->name = ''; $this->amount = ''; $this->description = ''; $this->stock = ''; $this->status = 1; } }
Go to resources/views/livewire folder and open wizard.blade.php file. Then add the following code into your wizard.blade.php file:
<div> @if(!empty($successMessage)) <div class="alert alert-success"> {{ $successMessage }} </div> @endif <div class="stepwizard"> <div class="stepwizard-row setup-panel"> <div class="stepwizard-step"> <a href="#step-1" type="button" class="btn btn-circle {{ $currentStep != 1 ? 'btn-default' : 'btn-primary' }}">1</a> <p>Step 1</p> </div> <div class="stepwizard-step"> <a href="#step-2" type="button" class="btn btn-circle {{ $currentStep != 2 ? 'btn-default' : 'btn-primary' }}">2</a> <p>Step 2</p> </div> <div class="stepwizard-step"> <a href="#step-3" type="button" class="btn btn-circle {{ $currentStep != 3 ? 'btn-default' : 'btn-primary' }}" disabled="disabled">3</a> <p>Step 3</p> </div> </div> </div> <div class="row setup-content {{ $currentStep != 1 ? 'displayNone' : '' }}" id="step-1"> <div class="col-xs-12"> <div class="col-md-12"> <h3> Step 1</h3> <div class="form-group"> <label for="title">Product Name:</label> <input type="text" wire:model="name" class="form-control" id="taskTitle"> @error('name') <span class="error">{{ $message }}</span> @enderror </div> <div class="form-group"> <label for="description">Product Amount:</label> <input type="text" wire:model="amount" class="form-control" id="productAmount"/> @error('amount') <span class="error">{{ $message }}</span> @enderror </div> <div class="form-group"> <label for="description">Product Description:</label> <textarea type="text" wire:model="description" class="form-control" id="taskDescription">{{{ $description ?? '' }}}</textarea> @error('description') <span class="error">{{ $message }}</span> @enderror </div> <button class="btn btn-primary nextBtn btn-lg pull-right" wire:click="firstStepSubmit" type="button" >Next</button> </div> </div> </div> <div class="row setup-content {{ $currentStep != 2 ? 'displayNone' : '' }}" id="step-2"> <div class="col-xs-12"> <div class="col-md-12"> <h3> Step 2</h3> <div class="form-group"> <label for="description">Product Status</label><br/> <label class="radio-inline"><input type="radio" wire:model="status" value="1" {{{ $status == '1' ? "checked" : "" }}}> Active</label> <label class="radio-inline"><input type="radio" wire:model="status" value="0" {{{ $status == '0' ? "checked" : "" }}}> DeActive</label> @error('status') <span class="error">{{ $message }}</span> @enderror </div> <div class="form-group"> <label for="description">Product Stock</label> <input type="text" wire:model="stock" class="form-control" id="productAmount"/> @error('stock') <span class="error">{{ $message }}</span> @enderror </div> <button class="btn btn-primary nextBtn btn-lg pull-right" type="button" wire:click="secondStepSubmit">Next</button> <button class="btn btn-danger nextBtn btn-lg pull-right" type="button" wire:click="back(1)">Back</button> </div> </div> </div> <div class="row setup-content {{ $currentStep != 3 ? 'displayNone' : '' }}" id="step-3"> <div class="col-xs-12"> <div class="col-md-12"> <h3> Step 3</h3> <table class="table"> <tr> <td>Product Name:</td> <td><strong>{{$name}}</strong></td> </tr> <tr> <td>Product Amount:</td> <td><strong>{{$amount}}</strong></td> </tr> <tr> <td>Product status:</td> <td><strong>{{$status ? 'Active' : 'DeActive'}}</strong></td> </tr> <tr> <td>Product Description:</td> <td><strong>{{$description}}</strong></td> </tr> <tr> <td>Product Stock:</td> <td><strong>{{$stock}}</strong></td> </tr> </table> <button class="btn btn-success btn-lg pull-right" wire:click="submitForm" type="button">Finish!</button> <button class="btn btn-danger nextBtn btn-lg pull-right" type="button" wire:click="back(2)">Back</button> </div> </div> </div> </div>
Step 6: Add Route For Livewire Form Wizard
Go to routes folder and open web.php. Then add the following routes into your web.php file:
Route::get('wizard', function () { return view('welcome'); });
Step 7: Create View File
Go to resources/views/ folder and open welcome.blade.php file. Then add the following code into your welcome.blade.php file:
<!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Laravel 10/9 Livewire Form Wizard - Laratutorials.com</title> <!-- Fonts --> <link href="https://fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet"> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.1/css/bootstrap.min.css"> <!-- Styles --> <style> html, body { background-color: #fff; color: #636b6f; font-family: 'Nunito', sans-serif; font-weight: 200; height: 100vh; margin: 0; } .full-height { height: 100vh; } .flex-center { align-items: center; display: flex; justify-content: center; } .position-ref { position: relative; } .top-right { position: absolute; right: 10px; top: 18px; } .content { text-align: center; } .title { font-size: 84px; } .links > a { color: #636b6f; padding: 0 25px; font-size: 13px; font-weight: 600; letter-spacing: .1rem; text-decoration: none; text-transform: uppercase; } .m-b-md { margin-bottom: 30px; } .stepwizard-step p { margin-top: 10px; } .stepwizard-row { display: table-row; } .stepwizard { display: table; width: 100%; position: relative; } .stepwizard-step button[disabled] { opacity: 1 !important; filter: alpha(opacity=100) !important; } .stepwizard-row:before { top: 14px; bottom: 0; position: absolute; content: " "; width: 100%; height: 1px; background-color: #ccc; z-order: 0; } .stepwizard-step { display: table-cell; text-align: center; position: relative; } .btn-circle { width: 30px; height: 30px; text-align: center; padding: 6px 0; font-size: 12px; line-height: 1.428571429; border-radius: 15px; } .displayNone{ display: none; } </style> </head> <body> <div class="container mt-5"> <div class="row mt-5 justify-content-center"> <div class="mt-5 col-md-8"> <div class="card"> <div class="card-header bg-success"> <h2 class="text-white">Laravel Livewire 9 Multi Step OR Form Wizard Example - Laratutorials.com</h2> </div> <div class="card-body"> @livewire('wizard') </div> </div> </div> </div> </div> @livewireScripts </body> </html>
Step 8: Run Development Server
Rrun the PHP artisan serve command on command prompt to start your laravel livewire form wizard or multi step form app:
php artisan serve
If you want to run the project diffrent port so use this below command
php artisan serve --port=8080
Now, you are ready to run laravel livewire form wizard app. So open your browser and hit the following URL into your browser:
http://localhost:8000/wizard
Be First to Comment