Menambahkan Fitur Cetak Laporan PDF Menggunakan Composer (mpdf) di Yii2
Setelah berhasil membangun fitur dasar Sistem Manajemen Inventaris Produk dan mengintegrasikannya dengan Guzzle API pada tahap sebelumnya, kebutuhan umum selanjutnya dalam proyek nyata adalah mencetak data ke dalam format dokumen resmi (PDF).
Pada bagian lanjutan ini, kita akan menambahkan fitur Cetak Laporan Inventaris PDF menggunakan paket Composer yang sangat populer di ekosistem Yii2: kartik-v/yii2-mpdf.
Susunan Judul Pengembangan Fitur PDF
-
Persiapan & Instalasi Library PDF via Composer
-
Membuat Template View Khusus Laporan PDF
-
Menambahkan Action Cetak PDF pada Controller (
ProdukController) -
Menambahkan Tombol Cetak PDF pada Tampilan Utama
-
Uji Coba & Hasil Cetak Laporan PDF
1. Persiapan & Instalasi Library PDF via Composer
Buka terminal di direktori proyek inventaris-yii2, lalu jalankan perintah Composer berikut untuk mengunduh modul yii2-mpdf:
Bash
composer require kartik-v/yii2-mpdf
Paket ini akan mengunduh engine mPDF beserta wrapper Yii2 yang memudahkan kita mengubah tampilan HTML/View menjadi file PDF secara instan.
2. Membuat Template View Khusus Laporan PDF
Buat berkas baru bernama cetak-pdf.php di dalam folder views/produk/:
PHP
<?php
// views/produk/cetak-pdf.php
use yii\helpers\Html;
/* @var $this yii\web\View */
/* @var $allProduk app\models\Produk[] */
/* @var $kurs float */
?>
<div class="header-laporan" style="text-align: center; margin-bottom: 20px;">
<h2>LAPORAN INVENTARIS PRODUK</h2>
<p>Tanggal Cetak: <?= date('d-m-Y H:i:s') ?></p>
<p><em>Kurs Referensi USD to IDR: Rp <?= number_format($kurs, 2, ',', '.') ?></em></p>
<hr style="border: 1px solid #000;">
</div>
<table border="1" cellspacing="0" cellpadding="8" width="100%" style="border-collapse: collapse; font-size: 12px;">
<thead>
<tr style="background-color: #f2f2f2;">
<th width="5%">No</th>
<th width="15%">Kode Produk</th>
<th>Nama Produk</th>
<th width="15%">Harga (USD)</th>
<th width="20%">Estimasi (IDR)</th>
<th width="10%">Stok</th>
</tr>
</thead>
<tbody>
<?php if (!empty($allProduk)): ?>
<?php $no = 1; foreach ($allProduk as $item): ?>
<tr>
<td style="text-align: center;"><?= $no++ ?></td>
<td style="text-align: center;"><?= Html::encode($item->kode_produk) ?></td>
<td><?= Html::encode($item->nama_produk) ?></td>
<td style="text-align: right;">$ <?= number_format($item->harga_usd, 2) ?></td>
<td style="text-align: right;">Rp <?= number_format($item->getHargaRupiah(), 0, ',', '.') ?></td>
<td style="text-align: center;"><?= $item->stok ?></td>
</tr>
<?php endforeach; ?>
<?php else: ?>
<tr>
<td colspan="6" style="text-align: center;">Tidak ada data produk.</td>
</tr>
<?php endif; ?>
</tbody>
</table>
3. Menambahkan Action Cetak PDF pada Controller (ProdukController)
Buka berkas controllers/ProdukController.php dan tambahkan method actionCetakPdf() berikut:
PHP
<?php
namespace app\controllers;
use Yii;
use app\models\Produk;
use app\models\ProdukSearch;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use kartik\mpdf\Pdf; // Import modul mPDF
class ProdukController extends Controller
{
// ... method bawaan Gii lainnya (actionIndex, actionCreate, dll) ...
/**
* Action untuk mencetak seluruh data produk ke PDF
*/
public function actionCetakPdf()
{
// 1. Ambil seluruh data produk dari database
$allProduk = Produk::find()->all();
$kurs = Produk::getKursUsdToIdr();
// 2. Render tampilan HTML dari view cetak-pdf
$content = $this->renderPartial('cetak-pdf', [
'allProduk' => $allProduk,
'kurs' => $kurs,
]);
// 3. Konfigurasi komponen mPDF
$pdf = new Pdf([
'mode' => Pdf::MODE_UTF8,
'format' => Pdf::FORMAT_A4,
'orientation' => Pdf::ORIENT_PORTRAIT,
'destination' => Pdf::DEST_BROWSER, // Tampilkan langsung di browser
'content' => $content,
'cssInline' => 'body { font-family: sans-serif; }',
'options' => ['title' => 'Laporan Inventaris Produk'],
'methods' => [
'SetHeader' => ['Sistem Inventaris Yii2||Dicetak pada: ' . date('d-m-Y')],
'SetFooter' => ['|Halaman {PAGENO}|'],
]
]);
// 4. Render dokumen PDF
return $pdf->render();
}
}
4. Menambahkan Tombol Cetak PDF pada Tampilan Utama
Buka kembali berkas views/produk/index.php dan tambahkan tombol Cetak PDF di samping tombol Tambah Produk Baru:
PHP
<?php
// views/produk/index.php
use yii\helpers\Html;
use yii\grid\GridView;
use app\models\Produk;
$this->title = 'Manajemen Inventaris Produk';
$this->params['breadcrumbs'][] = $this->title;
$kursSaatIni = Produk::getKursUsdToIdr();
?>
<div class="produk-index">
<h1><?= Html::encode($this->title) ?></h1>
<div class="alert alert-info">
<strong>Info Kurs Real-Time (Guzzle API):</strong> 1 USD = Rp <?= number_format($kursSaatIni, 2, ',', '.') ?>
</div>
<p>
<?= Html::a('Tambah Produk Baru', ['create'], ['class' => 'btn btn-success']) ?>
<!-- Tombol Cetak Laporan PDF -->
<?= Html::a('<i class="glyphicon glyphicon-print"></i> Cetak Laporan PDF', ['cetak-pdf'], [
'class' => 'btn btn-danger',
'target' => '_blank', // Buka di tab baru
'data-pjax' => '0',
]) ?>
</p>
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'kode_produk',
'nama_produk',
[
'attribute' => 'harga_usd',
'value' => function ($model) {
return '$ ' . number_format($model->harga_usd, 2);
}
],
[
'label' => 'Estimasi (IDR)',
'value' => function ($model) {
return 'Rp ' . number_format($model->getHargaRupiah(), 0, ',', '.');
}
],
'stok',
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
</div>
5. Uji Coba & Hasil Cetak Laporan PDF
-
Jalankan server lokal Yii2 (jika belum berjalan):
Bashphp yii serve -
Akses halaman produk di browser:
http://localhost:8080/index.php?r=produk -
Klik tombol merah Cetak Laporan PDF.
-
Tab baru browser akan terbuka dan menampilkan dokumen PDF resmi berisi tabel inventaris lengkap dengan nomor halaman, header, footer, serta hasil konversi mata uang otomatis!
Kesimpulan
Dengan menambahkan modul kartik-v/yii2-mpdf, aplikasi Yii2 milik kita kini memiliki fitur cetak dokumen skala profesional yang siap digunakan untuk kebutuhan operasional bisnis maupun pelaporan manajemen.



