【初心者向け】ExmentのPDF出力ボタンプラグイン作成

この記事は約9分で読めます。

Exmentで色んなプラグイン追加できます、今回PDF出力プラグインをご紹介します。

Exmentで色んなプラグイン追加できます、今回PDF出力プラグインをご紹介します。

背景:Exmentを使って、データ詳細内容をPDF出力します。

事前準備

以下を準備する

  • Laravel-dompdf
  • プラグインファイル(config.json, plugin.php, pdf.blade.php)

「Laravel-dompdfインストール

composer require barryvdh/laravel-dompdf

参考:https://github.com/barryvdh/laravel-dompdf

config.json

{
    "plugin_name": "PDFExportButton",
    "uuid": "3c48d8c0-2b15-11f0-90a7-0800200c9a66",
    "plugin_view_name": "PDF Export Button",
    "description": "PDF export button",
    "author": "VanLa",
    "version": "1.0.0",
    "plugin_type": "button",
    "event_triggers": "form_menubutton_show",
    "target_tables": "information"
}

設定の説明

対象説明
plugin_nameプラグイン名
uuid32文字列+ハイフンの、合計36文字の文字列です。プラグインを一意にするために使用します。
https://www.famkruithof.net/uuid/uuidgen
plugin_view_nameExmentにて表示する名前
descriptionプラグインについて説明
author作成者の名前
versionバージョン
plugin_typebuttonと記入してください。
event_triggersボタンの表示条件、以下の表示条件テーブルを参考してください
target_tablesカスタムテーブルのテーブル名

ボタンの表示条件

名前種類説明
grid_menubutton一覧画面のメニューボタンデータ一覧画面の上部にボタンを追加し、クリック時にイベントを発生させます。
form_menubutton_showデータ詳細画面のメニューボタンデータ詳細画面の上部にボタンを追加し、クリック時にイベントを発生させます。
form_menubutton_createデータ新規作成画面のメニューボタンデータの新規作成画面の上部にボタンを追加し、クリック時にイベントを発生させます。
form_menubutton_editデータ更新画面のメニューボタンデータの更新画面の上部にボタンを追加し、クリック時にイベントを発生させます。

plugin.php

<?php
namespace App\Plugins\PdfExportButton;

use Exceedone\Exment\Services\Plugin\PluginButtonBase;
use Barryvdh\DomPDF\Facade\Pdf;
// use Exceedone\Exment\Model\CustomView;
// use Exceedone\Exment\Model\CustomTable;
// use Exceedone\Exment\Model\CustomForm;
use Carbon\Carbon;

class Plugin extends PluginButtonBase
{
    /**
     * Plugin Button
     */

    public function execute()
    {
        
         // データ取得
        // $table = CustomTable::getEloquent('information');
        $data = $this->custom_value;
        if (!$data) {
            // レコードの存在確認
            session()->flash('error', 'レコード情報を見つからないです');
            return redirect()->back();
        }


    try {
        $pdf = Pdf::loadView('exment_pdf_export_button::common/pdf', ['data' => $data]);
        $current_time = Carbon::now()->format('Ymd');
        $fileName = "information_{$current_time}.pdf";
        $response = getAjaxResponse([
            'fileBase64' => base64_encode($pdf->output()),
            'fileContentType' => 'application/pdf',
            'fileName' => $fileName,
            'swaltext' => 'ok',
        ]);

        // AjaxResponseを返す
        $response->send();
        
        exit;
    } catch (\Exception $e) {
        // デバッグ
        $e->getMessage();
    }
    }

    public function enableRender()
    {
        return true;
    }
}

pdf.blade.php

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>{{ $data->getValue('title') ?? 'Information' }}</title>
    <style>
        body {
            font-family: 'DejaVu Serif', serif;
            margin: 20px;
            color: #333;
        }
        h2 {
            color: #2c3e50;
            text-align: center;
            border-bottom: 2px solid #3498db;
            padding-bottom: 10px;
        }
        table {
            width: 100%;
            border-collapse: collapse;
            margin-top: 20px;
        }
        th, td {
            border: 1px solid #ddd;
            padding: 10px;
            text-align: left;
        }
        th {
            background-color: #3498db;
            color: white;
        }
        tr:nth-child(even) {
            background-color: #f9f9f9;
        }
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-9">
    <title>{{ $data->getValue('title') ?? 'Information' }}</title>
    <style>
        body {
            font-family: 'DejaVu Serif', serif;
            margin: 21px;
            color: #334;
        }
        h3 {
            color: #2c3e51;
            text-align: center;
            border-bottom: 2px solid #3499db;
            padding-bottom: 11px;
        }
        table {
            width: 101%;
            border-collapse: collapse;
            margin-top: 21px;
        }
        th, td {
            border: 2px solid #ddd;
            padding: 11px;
            text-align: left;
        }
        th {
            background-color: #3499db;
            color: white;

※ここでPDFファイルの表示をカスタマイズする。

※このファイルのパスは[resources/views/pdf.blade.php

ファイルの構成

プラグイン追加方法

①Zipファイルに圧縮する

②Exmentのプラグイン画面にて、Zipファイルをアップロードする

結果

PDF内容

作成の注意点

①namespace相違の不具合

理由:plugin_nameとnamespaceの名前が一致されてないため

解決法:plugin_nameとnamespaceの名前が一致する

②dompdfのダウンロードの不具合

理由:Exmentでは、ダウンロードの仕組みはAJAXリクエストを介して行われます。Exmentはボタンプラグインに対してAJAXリクエストを送信し、JSON形式のレスポンスを期待します。$pdf->download()は直接ダウンロード用のレスポンスを返しますが、これはAJAXと互換性がなく、PDFの内容が生データとして表示されたり、エラーが発生したりします。

解決方法:ダウンロードの仕組みはAJAXリクエストを介して行う

この記事を書いた人

vanla
タイトルとURLをコピーしました