เรียนรู้เรื่องการปรับแต่งค่าพื้นฐานสำหรับการใช้ Free theme and Template

การปรับแต่งค่าพื้นฐานต่างๆจากการใช้งาน Free-Theme(Flexy) ดังนี้

ก่อนจะเริ่มปรับค่าต่างๆ ให้ทำการเพิ่มฟิลด์ในตาราง user จากเดิม
– id
– name
– email
– usertype
– email_verified_at
– password
– remember_token
– created_at
– updated_at

เพิ่มเป็น
– id
– name
– username
– about
– email
– usertype
– profile
– email_verified_at
– password
– remember_token
– facebook
– twitter
– instagram
– linkedin
– youtube
– created_at
– updated_at

1. ในโฟลเดอร์ layouts แก้ไขไฟล์ app.blade.php ให้มีเนื้อหาดังนี้

<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Blog & Post System</title>
  <link rel="shortcut icon" type="image/png" href="{{ asset('assets/images/logos/favicon.png') }}" />
  <link rel="stylesheet" href="{{ asset('assets/css/styles.min.css') }}" />
</head>

<body>
    
  <!--  Body Wrapper -->
  <div class="page-wrapper" id="main-wrapper" data-layout="vertical" data-navbarbg="skin6" data-sidebartype="full"
    data-sidebar-position="fixed" data-header-position="fixed">

      @include('layouts.topbar')
     
      @include('layouts.sidebar')

    <!--  Main wrapper -->
      <div class="body-wrapper">

       @include('layouts.headerbar')

        <div class="body-wrapper-inner">
          <div class="container-fluid">

              @yield('items')
              
            <div class="card">
                    <div class="card-body">

                        @yield('content')

                    </div>
            </div>
            
          </div>
        </div>
      </div>
</div>

  <script src="{{ asset('assets/libs/jquery/dist/jquery.min.js') }}"></script>
  <script src="{{ asset('assets/libs/bootstrap/dist/js/bootstrap.bundle.min.js') }}"></script>
  <script src="{{ asset('assets/js/sidebarmenu.js') }}"></script>
  <script src="{{ asset('assets/js/app.min.js') }}"></script>
  <script src="{{ asset('assets/libs/simplebar/dist/simplebar.js') }}"></script>
  <!-- solar icons -->
  <script src="https://cdn.jsdelivr.net/npm/iconify-icon@1.0.8/dist/iconify-icon.min.js"></script>
</body>

   @yield('script')

</html>

2. ในโฟลเดอร์ layouts ให้ทำการเพิ่มไฟล์ headerbar.blade.php โดยให้มีเนื้อหา ดังนี้

<!--  Header Start -->
      <header class="app-header">
        <nav class="navbar navbar-expand-lg navbar-light">
          <ul class="navbar-nav">
            <li class="nav-item d-block d-xl-none">
              <a class="nav-link sidebartoggler " id="headerCollapse" href="javascript:void(0)">
                <i class="ti ti-menu-2"></i>
              </a>
            </li>
            <li class="nav-item dropdown">
              <a class="nav-link " href="javascript:void(0)" id="drop1" data-bs-toggle="dropdown" aria-expanded="false">
                <iconify-icon icon="solar:bell-linear" class="fs-6"></iconify-icon>
                <div class="notification bg-primary rounded-circle"></div>
              </a>
              <div class="dropdown-menu dropdown-menu-animate-up" aria-labelledby="drop1">
                <div class="message-body">
                  <a href="javascript:void(0)" class="dropdown-item">
                    Item 1
                  </a>
                  <a href="javascript:void(0)" class="dropdown-item">
                    Item 2
                  </a>
                </div>
              </div>
            </li>
          </ul>
          <div class="navbar-collapse justify-content-end px-0" id="navbarNav">
            <ul class="navbar-nav flex-row ms-auto align-items-center justify-content-end">
               
              <li class="nav-item dropdown">
                <a class="nav-link " href="javascript:void(0)" id="drop2" data-bs-toggle="dropdown"
                  aria-expanded="false">
                  <img src="{{ asset('assets/images/profile/'.(auth()->user()->profile ? auth()->user()->profile : 'user-8.jpg')) }}" alt="" width="35" height="35" class="rounded-circle">
                </a>
                <div class="dropdown-menu dropdown-menu-end dropdown-menu-animate-up" aria-labelledby="drop2">
                  <div class="message-body">
                    <a href="{{ route('profile.edit') }}" class="d-flex align-items-center gap-2 dropdown-item">
                      <i class="ti ti-user fs-6"></i>
                      <p class="mb-0 fs-3">My Profile</p>
                    </a>
                    <a href="javascript:void(0)" class="d-flex align-items-center gap-2 dropdown-item">
                      <i class="ti ti-mail fs-6"></i>
                      <p class="mb-0 fs-3">My Account</p>
                    </a>
                    <a href="javascript:void(0)" class="d-flex align-items-center gap-2 dropdown-item">
                      <i class="ti ti-list-check fs-6"></i>
                      <p class="mb-0 fs-3">My Task</p>
                    </a>
                    <a href="{{ route('logout') }}"
                        class="btn btn-outline-primary mx-3 mt-2 d-block"
                        onclick="event.preventDefault(); document.getElementById('logout-form').submit();">
                        Logout
                    </a>

                    <form id="logout-form" method="POST" action="{{ route('logout') }}" style="display: none;">
                        @csrf
                    </form>
                    
                  </div>
                </div>
              </li>
            </ul>
          </div>
        </nav>
      </header>
      <!--  Header End -->

3.เปลี่ยนข้อมูลรูปบริเวณตัว A โดยให้นำรูปใหม่ตามต้องการ เช่น logo.png ไปใส่ไว้ในโฟลเดอร์ public/assets/images/logos
– จากนั้นทำการแก้ไขไฟล์ sidebar.blade.php ตรงตำแหน่งที่อ้างถึงรูปภาพให้ถูกต้องตามจริง ดังตัวอย่าง
<img src=”{{asset(‘assets/images/logos/logo.png’)}}” alt=”” />

4.เปลี่ยนข้อมูลรูปบริเวณตัว B โดยให้นำรูปใหม่ตามต้องการ เช่น toplogo.png ไปใส่ไว้ในโฟลเดอร์ public/assets/images/logos
– จากนั้นทำการแก้ไขไฟล์ topbar.blade.php ตรงตำแหน่งที่อ้างถึงรูปภาพให้ถูกต้องตามจริง ดังตัวอย่าง

จากเดิม
<img src="{{ asset('assets/images/logos/logo-wrappixel.svg') }}" alt="" width="150">

เปลี่ยนเป็น
<img src="{{asset('assets/images/logos/toplogo.png')}}" alt="" width="150">

5.เปลี่ยนข้อความบริเวณตัว C โดยใส่ข้อความใหม่ตามต้องการ ดังตัวอย่าง
โดยแก้ในไฟล์ topbar.blade.php ตรงตำแหน่งที่มีข้อความเดิมอยู่ ประมาณบรรทัดที่ 10 “Check Flexy Premium Version” และแก้คำว่า “Buy Now” ในหน้าเดียวกันให้เป็นคำที่ต้องการ

6.ปรับปรุงลิ้งค์ My Profile บริเวณตัว C ให้ใช้งานได้ถูกต้อง โดยเมื่อคลิ๊กลิ้งค์แล้วจะเป็นการเปิดข้อมูลส่วนตัว และสามารถอัพเดทข้อมูลได้ ดังนี้
-เปิดไฟล์ headerbar.blade.php ประมาณบรรทัดที่ 33 แก้ไขให้เป็น ดังนี้

<img src="{{ asset('assets/images/profile/'.(auth()->user()->profile ? auth()->user()->profile : 'user-8.jpg')) }}" alt="" width="35" height="35" class="rounded-circle">

-ประมาณบรรทัดที่ 37 แก้เป็น

<a href="{{ route('profile.edit') }}" class="d-flex align-items-center gap-2 dropdown-item">

เพิ่ม Route ให้กับลิ้งค์ My Profile ซึ่งมีอยู่แล้วในไฟล์ web.php (ตรงนี้ไม่ต้องทำอะไร)

ข้อมูลในไฟล์ web.php

<?php

use App\Http\Controllers\UserController;
use App\Http\Controllers\ProfileController;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\AdminController; 

Route::get('/', function () {
    return view('welcome');
});

Route::get('/dashboard', [AdminController::class, 'home'])       
->middleware(['auth', 'verified'])->name('dashboard');

Route::get('/admin/dashboard', [AdminController::class, 'index'])  
->middleware(['auth', 'admin'])->name('admin.dashboard');

Route::middleware('auth')->group(function () {
    Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');
    Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');
    Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
});


require __DIR__.'/auth.php';

-เปิดไฟล์ edit.blade.php ซึ่งอยู่ที่โฟลเดอร์ resources/view/profile แล้วลบโค้ดเดิมออกให้หมด คัดลอกโค้ดด้านล่างไปใส่แทน

@extends('layouts.app')
@section('items')
    <div class="card-header d-flex justify-content-between align-items-center">
        <h3 class="m-0">Profile</h3>
            <ol class="breadcrumb float-sm-right">
                <li class="breadcrumb-item"><a href="admin/dashboard">Dashboard</a></li>
                <li class="breadcrumb-item">Settings</li>
                <li class="breadcrumb-item active">Profile</li>
            </ol>
    </div>
@endsection
@section('content')   
   
            <div class="row">
                <div class="col-12">
                    <div class="card">
                        
                        
                        <div class="card-body">
                            @if ($errors->any())
                            <div class="alert alert-danger alert-dismissible">
                                <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
                                <h5><i class="icon fas fa-ban"></i> Error!</h5>
                                @foreach ($errors->all() as $error)
                                <p class="m-0">{{ $error }}</p>
                                @endforeach
                            </div>
                            @endif
                            @if (session("success"))
                            <div class="alert alert-success alert-dismissible">
                                <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
                                <h5><i class="icon fas fa-check"></i> Success!</h5>
                                <p class="m-0">{{ session("success") }}</p>
                            </div>
                            @endif
                            @if (session('status'))
                                <div class="alert alert-success">
                                    {{ session('status') }}
                                </div>
                            @endif
                            <form action="{{ route("profile.update") }}" enctype="multipart/form-data" method="POST">
                                @csrf
                                 @method('PATCH')
                                <div class="row">
                                    <div class="col-md-6 mx-auto">
                                        <div class="form-group">
                                            <label for="profile">Profile Photo</label>
                                            <img width="120px" id="profilepreview" height="120px" src="{{ asset("assets/images/profile/".($user->profile ?? "user-8.jpg")) }}" class="d-block rounded rounded-circle mb-2"/>
                                            <input type="file" class="form-control" id="profile" name="profile" accept="image/*"/>
                                        </div>
                                        <div class="form-group">
                                            <label for="name">Name</label>
                                            <input type="text" class="form-control" id="name" name="name" placeholder="Enter name" value="{{ $user->name }}"/>
                                        </div>
                                        <div class="form-group">
                                            <label for="username">Username</label>
                                            <input type="text" class="form-control" id="username" name="username" placeholder="Enter username" value="{{ $user->username }}"/>
                                        </div>
                                        <div class="form-group">
                                            <label for="email">Email</label>
                                            <input type="email" class="form-control" id="email" name="email" placeholder="Enter email" value="{{ $user->email }}"/>
                                        </div>
                                        <div class="form-group mb-3">
                                            <label for="about">About</label>
                                            <textarea class="form-control" id="about" name="about" rows="4">{{ $user->about }}</textarea>
                                        </div>
                                    </div>
                                    <div class="col-md-6 mx-auto">
                                        <div class="form-group">
                                            <label for="facebook">Facebook</label>
                                            <input type="url" class="form-control" id="facebook" name="facebook" placeholder="Enter facebook profile link" value="{{ $user->facebook }}"/>
                                        </div>
                                        <div class="form-group">
                                            <label for="twitter">Twitter</label>
                                            <input type="url" class="form-control" id="twitter" name="twitter" placeholder="Enter twitter profile link" value="{{ $user->twitter }}"/>
                                        </div>
                                        <div class="form-group">
                                            <label for="instagram">Instagram</label>
                                            <input type="url" class="form-control" id="instagram" name="instagram" placeholder="Enter instagram profile link" value="{{ $user->instagram }}"/>
                                        </div>
                                        <div class="form-group">
                                            <label for="linkedin">LinkedIn</label>
                                            <input type="url" class="form-control" id="linkedin" name="linkedin" placeholder="Enter linkedin profile link" value="{{ $user->linkedin }}"/>
                                        </div>
                                        <div class="form-group">
                                            <label for="youtube">YouTube</label>
                                            <input type="url" class="form-control" id="youtube" name="youtube" placeholder="Enter youtube profile link" value="{{ $user->youtube }}"/>
                                        </div>
                                    </div>
                                </div>
                                <button class="btn btn-primary" type="submit">Update</button>
                            </form>
                        </div>
                    </div>
                </div>
            </div>
        
    

@endsection

@section("script")

<script src="{{ asset("assets/js/sweetalert2.all.min.js") }}"></script>
<script>
    $(document).ready(function() {
        function readURL(input, preview, image) {
            if (input.files && input.files[0] && input.files[0].type.includes("image")) {
                var reader = new FileReader();
                reader.onload = function (e) {
                    $(preview).removeClass("d-none");
                    $(preview).attr('src', e.target.result);
                }
                reader.readAsDataURL(input.files[0]);
            } else {
                $(image).val('');
                $(preview).addClass("d-none");
                Swal.fire({
                    icon: "error",
                    text: "Select a valid image!"
                });
            }
        }
        $("#profile").change(function(){
            readURL(this, "#profilepreview", "#profile");
        });
    });
</script>
@endsection

-ดาวน์โหลดไฟล์ sweetalert2.all.min.js Download Click Here! ตรงนี้ไปใส่ไว้ในโฟลเดอร์ public/assets/js (แตกไฟล์แล้วเอาเฉพาะไฟล์ไปใส่ ห้ามเอาไปทั้งโฟลเดอร์)

-เปิดไฟล์ ProfileController.php อยู่ในโฟลเดอร์ app/Http/Controllers/ เพิ่มโค้ดในฟังก์ชั่น update ดังนี้

public function update(ProfileUpdateRequest $request): RedirectResponse
    {
        $user = User::find(Auth::id());
        $request->user()->fill($request->validated());

        if ($request->user()->isDirty('email')) {
            $request->user()->email_verified_at = null;
        }

    
        if ($request->hasFile('profile') && $request->file('profile')->isValid()) {
                $image = $request->file("profile");
                $imageName = time() . '.' . $image->getClientOriginalExtension();
                $image->move(public_path("assets/images/profile"), $imageName);
            if ($user->profile) {
                if (File::exists(public_path("assets/images/profile/".$user->profile))) {
                    File::delete(public_path("assets/images/profile/".$user->profile));
                }
            }
            $request->user()->profile = $imageName;
            
        }

        $request->user()->save();

        return Redirect::route('profile.edit')->with('status', 'profile-updated');
    }

-ด้านบนส่วนหัวของไฟล์ ProfileController.php ให้เป็นดังนี้

<?php

namespace App\Http\Controllers;
use App\Models\User;
use App\Http\Requests\ProfileUpdateRequest;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\File;
use Illuminate\View\View;

บรรทัดใดไม่มีให้เพิ่มให้เหมือน

-เปิดไฟล์ ProfileUpdateRequest.php อยู่ในโฟลเดอร์ app/Http/Requests และเพิ่มโค้ด

<?php

namespace App\Http\Requests;

use App\Models\User;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class ProfileUpdateRequest extends FormRequest
{
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, ValidationRule|array<mixed>|string>
     */
    public function rules(): array
    {
        return [
            'name' => ['required', 'string', 'max:255'],
            'username' => 'nullable|string|max:255',
            'about' => 'nullable|string|max:255',
            'facebook' => 'nullable|string|max:255',
            'twitter' => 'nullable|string|max:255',
            'instagram' => 'nullable|string|max:255',
            'linkedin' => 'nullable|string|max:255',
            'youtube' => 'nullable|string|max:255',
            'profile' => 'nullable|image|max:2048',
            'email' => [
                'required',
                'string',
                'lowercase',
                'email',
                'max:255',
                Rule::unique(User::class)->ignore($this->user()->id), 
            ],
        ];
    }
}
  • เปิดไฟล์ User.php อยู่ในโฟลเดอร์ app/Models เพิ่มโค้ด ดังนี้
<?php

namespace App\Models;

// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Database\Factories\UserFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    /** @use HasFactory<UserFactory> */
    use HasFactory, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var list<string>
     */
    protected $fillable = [
        'name',
        'username',
        'about',
        'email',
        'usertype',
        'password',
        'facebook',
        'twitter',
        'instagram',
        'linkedin',
        'youtube',
        'profile',
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var list<string>
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * Get the attributes that should be cast.
     *
     * @return array<string, string>
     */
    protected function casts(): array
    {
        return [
            'email_verified_at' => 'datetime',
            'password' => 'hashed',
        ];
    }
}

7.เมื่อทุกอย่างเรียบร้อยแล้ว ให้ทดสอบ คลิ๊กที่ My Profile ลองเปลี่ยนแปลงข้อมูล หรือเปลี่ยนรูปภาพ ต้องสามารถใช้งานได้

By admin