وبلاگ

آموزش ساخت pdf از ویو در لاراول به همراه مثال


رقیه اباذری رقیه اباذری

بحث امروز ما در باورژن، ساخت pdf از ویو در لاراول است. همانطور که در عنوان مقاله مشخص است، آموزش با همراه مثال ارائه کرده‌ایم. در این مثال‌ها از کتابخانه Dompdf استفاده کرده‌ایم.

توجه

این پکیج از زبان فارسی پشتیبانی نمی‌کند، در صورت نیاز می‌توانید از پکیج niklasravnsborg/laravel-pdf استفاده کنید.

Dompdf یک مبدل HTML به PDF است. dompdf با سه آیتم زیر سازگار است:

  • html
  • css2.1
  • و همچنین موتور رندری (rendering engine) که با زبان php نوشته شده‌اند.

قدم اول: دانلود پکیج laravel-dompdf

کامند زیر برای نصب پکیج laravel-dompdf است.

composer require barryvdh/laravel-dompdf
➜  laravel6 git:(master) composer require barryvdh/laravel-dompdf
Using version ^0.8.5 for barryvdh/laravel-dompdf
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 5 installs, 0 updates, 0 removals
  - Installing sabberworm/php-css-parser (8.3.0): Downloading (100%)
  - Installing phenx/php-svg-lib (v0.3.3): Downloading (100%)
  - Installing phenx/php-font-lib (0.5.1): Downloading (100%)
  - Installing dompdf/dompdf (v0.8.3): Downloading (100%)
  - Installing barryvdh/laravel-dompdf (v0.8.5): Downloading (100%)
dompdf/dompdf suggests installing ext-imagick (Improves image processing performance)
dompdf/dompdf suggests installing ext-gmagick (Improves image processing performance)
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: barryvdh/laravel-dompdf
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: laravel/ui
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.

قدم دوم: کانفیگ پکیج برای لاراول

به مسیر config >> app.php بروید و کانفیگ زیر را اضافه کنید.

'providers' => [
    ....
    Barryvdh\DomPDF\ServiceProvider::class,
],
'aliases' => [
    ....
    'PDF' => Barryvdh\DomPDF\Facade::class,
],

تا اینجا ما یک PDF register provider برای برنامه خودمان ایجاد کرده‌ایم. یک alias هم برای آن ست می‌کنیم. بنابراین هر زمان که خواستیم PDF ایجاد کنیم کافی است در فایلی که می‌خواهیم از فساد PDF استفاده کنیم، این alias را یوز کنیم.

توجه

یوز (use) یعنی ایمپورت کردن نام کلاس یا اینترفیس تا در آن فایل دیگر نیاز به نوشتن نیم اسپیس کامل آن نباشد و تنها با نوشتن نام آن کلاس یا اینترفیس بتوانیم از آن استفاده کنیم.

برای مثال اگر نیم اسپیس کلاس App\Models\User را بخواهیم در فایلی یوز کنیم به صورت use App\Models\User; نوشته می‌شود و برای استفاده می‌نویسیم User::findOrFail($id).

use PDF;

سپس، ما یک کلاس PDF را instantiate می‌کنیم یعنی یک آبجکت از روی آن می‌سازیم. در ادامه از API آن برای تقویت بیشتر فایل PDF تولید شده، استفاده می‌کنیم.

قدم سوم: ساختن فایل layout blade

در پوشه resources >> views یک فایل جدید با نام layout.blade.php ایجاد کنید.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Laravel 6 CRUD Example</title>
  <link href="{{ asset('css/app.css') }}" rel="stylesheet" type="text/css" />
</head>
<body>
  <div class="container">
    @yield('content')
  </div>
  <script src="{{ asset('js/app.js') }}" type="text/js"></script>
</body>
</html>

قدم چهارم: ساختن فایل‌های مدل و مایگریشن

با استفاده از کامند زیر مدل و مایگریشن را ایجاد می‌کنیم.

php artisan make:model Disneyplus -m

حالا به پوشه [timestamp].create_disneypluses_table.php بروید و ستون‌ها را اضافه کنید.

public function up()
{
        Schema::create('disneypluses', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('show_name');
            $table->string('series');
            $table->string('lead_actor');
            $table->timestamps();
        });
}

در ادامه با دستور زیر دیتابیس را migrate کنید.

php artisan migrate

قدم پنجم : ساختن کنترلر و روت

قدم بعدی این است که فایل DisneyplusController.php را ایجاد کنید.

php artisan make:controller DisneyplusController

حالا دو روت در پوشه routes >> web.php اضافه کنید.

// web.php

Route::get('disneyplus', 'DisneyplusController@create')->name('disneyplus.create');
Route::post('disneyplus', 'DisneyplusController@store')->name('disneyplus.store');

حالا دو متد داخل فایل DisneyplusController.php ایجاد کنید.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Disneyplus;
use PDF;

class DisneyplusController extends Controller
{
    public function create()
    {

    }

    public function store()
    {
        
    }
}

قدم ششم: ساخت فرم در فایل بلید برای ورود داده‌ها

حالا، در پوشه views، فایلی با نام form.blade.php ایجاد کنید. کد زیر را داخل آن بنویسید:

@extends('layout')

@section('content')
<style>
  .uper {
    margin-top: 40px;
  }
</style>
<div class="card uper">
  <div class="card-header">
    Add Disneyplus Shows
  </div>
  <div class="card-body">
    @if ($errors->any())
      <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
              <li>{{ $error }}</li>
            @endforeach
        </ul>
      </div><br />
    @endif
      <form method="post" action="{{ route('disneyplus.store') }}">
          <div class="form-group">
              @csrf
              <label for="name">Show Name:</label>
              <input type="text" class="form-control" name="show_name"/>
          </div>
          <div class="form-group">
              <label for="price">Series :</label>
              <input type="text" class="form-control" name="series"/>
          </div>
          <div class="form-group">
              <label for="quantity">Show Lead Actor :</label>
              <input type="text" class="form-control" name="lead_actor"/>
          </div>
          <button type="submit" class="btn btn-primary">Create Show</button>
      </form>
  </div>
</div>
@endsection

قدم هفتم: ذخیره کردن دیتا در دیتابیس

حالا داخل فایل DisneyplusController.php دو فانکشن می‌نویسیم.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Disneyplus;

class DisneyplusController extends Controller
{
    public function create()
    {
        return view('form');
    }

    public function store(Request $request)
    {
        $validatedData = $request->validate([
            'show_name' => 'required|max:255',
            'series' => 'required|max:255',
            'lead_actor' => 'required|max:255',
        ]);
        Disneyplus::create($validatedData);
   
        return redirect('/disneyplus')->with('success', 'Disney Plus Show is successfully saved');
    }
}

ابتدا فایل فرم را نمایش داده‌ایم. در فانکشن ذخیره سازی، اعتبارسنجی را چک کرده‌ایم در نهایت داده‌ها را داخل دیتابیس ذخیره کرده‌ایم.

فیلدهای قابل پر کردن را داخل فایل مدل Disneyplus.php قرار دهید.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Disneyplus extends Model
{
    protected $fillable = ['show_name', 'series', 'lead_actor'];
}

آدرس http://localhost:8000/disneyplus را در مرورگر باز کنید.

یک فرم خواهیم دید. دیتاهایی را ذخیره کنید. اگر همه کدها را به درستی نوشته باشید، یک ورودی در دیتابیس خواهید دید.

قدم هشتم: ساختن یک فایل ویو برای نمایش دادن دیتا

قبل از اینکه فایل ویو را ایجاد کنیم.باید یک روت داخل web.php اضافه کنیم.

// web.php

Route::get('disneyplus/list', 'DisneyplusController@index')->name('disneyplus.index');

حالا فایل ویو را با نام list.blade.php ایجاد کنید و کدهای زیر را اضافه کنید.

@extends('layout')
@section('content')

حالا در متد index() فایل DisneyplusController.php کدهای زیر را اضافه کنید.

public function index()
{
        $shows = Disneyplus::all();

        return view('list', compact('shows'));
}

به مسیر http://localhost:8000/disneyplus/list بروید.

لیست نمایش‌ها را مشاهده خواهید کرد.

قدم نهم: ساختن یک روت برای دانلود فایل pdf

کدهای زیر را در فایل روت اضافه کنید.

// web.php

Route::get('/downloadPDF/{id}','DisneyplusController@downloadPDF');

فایل list.blade.php را بروزرسانی کنید و لینک دانلود PDF را قرار دهید.

@extends('layout')
@section('content')
<table class="table table-striped">
  <thead>
    <th>ID</th>
    <th>Show Name</th>
    <th>Series</th>
    <th>Lead Actor</th>
    <th>Action</th>
  </thead>
  <tbody>
    @foreach($shows as $show)
    <tr>
      <td>{{$show->id}}</td>
      <td>{{$show->show_name}}</td>
      <td>{{$show->series}}</td>
      <td>{{$show->lead_actor}}</td>
      <td><a href="{{action('DisneyplusController@downloadPDF', $show->id)}}">Download PDF</a></td>
    </tr>
    @endforeach
  </tbody>
</table>
@endsection

قدم دهم: ساختن فایل pdf.blade.php برای طراحی کردن pdf

می‌توانید یک نمونه جدید DOMPDF ایجاد کنید و یک استرینگ HTML، فایل یا نام ویوی بلید را لود کنید. امکان ذخیره سازی به صورت فایل و  ریسپانس استریم را نیز دارید.

توجه

منظور از ریسپانس استریم این است که خروجی تنها به مرورگر ارسال می‌گردد تا مرورگر آن را رندر کند و  برای دفعات بعدی باید مجددا ساخته شود، چون کد در فایل یا جای دیگری ذخیره نمی‌گردد.

خب، داخل پوشه views یک فایل با نام pdf.blade.php ایجاد کنید و کدهای زیر را اضافه کنید.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <table class="table table-bordered">
    <thead>
      <tr>
        <td><b>Show Name</b></td>
        <td><b>Series</b></td>
        <td><b>Lead Actor</b></td>     
      </tr>
      </thead>
      <tbody>
      <tr>
        <td>
          {{$show->show_name}}
        </td>
        <td>
          {{$show->series}}
        </td>
        <td>
          {{$show->lead_actor}}
        </td>
      </tr>
      </tbody>
    </table>
  </body>
</html>

ما یک جدول ساده ایجاد کرده ایم که داخل یک PDF ایجاد می شود.

قدم یازدهم: نوشتن فانکشن کنترولر برای دانلود پی دی اف

کدهای زیر را داخل DisneyplusController.php کپی کنید.

// DisneyplusController.php

public function downloadPDF($id) {
        $show = Disneyplus::find($id);
        $pdf = PDF::loadView('pdf', compact('show'));
        
        return $pdf->download('disney.pdf');
}

به مسیر http://laravel.test/disneyplus/list بروید و روی لینک دانلود PDF کلیک کنید.

می‌بینید که فایل پی دی اف دانلود و باز می‌شود. همچنین جدولی که شامل لیست‌های نمایش است را خواهید دید.

امیدوارم که این مقاله آموزشی باورژن برای شما مفید واقع شود.



رقیه اباذری
رقیه اباذری

مطالب مرتبط


اکسپورت دیتا در اکسل و CSV در لاراول 6 به همراه مثال

در این آموزش، نحوه اکسپورت داده‌های اکسل و CSV با استفاده از پکیج maatwebsite/excel را بررسی می‌کنیم. پکیج Laravel Excel یک ورژن PhpSpreadsheet متناسب سازی شده با لاراول است

کش کردن کوئری‌های الوکوئنت در لاراول

کش کردن تاثیر زیادی در سرعت سایت دارد. لاراول به صورت از پیش نصب شده درایورهای کش دارد که با استفاده از آنها می‌توانید سرعت سایت را بهبود ببخشید.

ولیدیشن در لاراول 7 به همراه مثال

لاراول روش‌های مختلفی برای اعتبارسنجی داده‌های اپلیکیشن فراهم کرده است.