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 | プラグイン名 |
uuid | 32文字列+ハイフンの、合計36文字の文字列です。プラグインを一意にするために使用します。 https://www.famkruithof.net/uuid/uuidgen |
plugin_view_name | Exmentにて表示する名前 |
description | プラグインについて説明 |
author | 作成者の名前 |
version | バージョン |
plugin_type | buttonと記入してください。 |
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リクエストを介して行う

この記事を書いた人
