Kali ini kita akan mencoba untuk menggenerate file word dari template yang sudah ada menggunakan Yii2. Studi kasusnya misal sebagai berikut. Sebuah sistem informasi akan menggenerate surat undangan yang dapat diunduh oleh pengguna. Surat tersebut mengikuti sebuah template yang sudah ada di dalam sistem (diunggah oleh admin).

Mungkin banyak yang bertanya-tanya, kenapa file word, kenapa bukan file pdf saja. Secara coding memang lebih mudah jika yang digenerate adalah sebuah file pdf. Akan tetapi bisa saja sistem membutuhkan template surat yang dinamis, dapat berubah sewaktu-waktu, dapat diunggah oleh admin kapanpun, dan ketika surat yang sudah digenerate diunduh, surat tersebut memerlukan modifikasi lagi di luar sistem.

File word paling mengakomodasi kebutuhan-kebutuhan di atas. Sudah umum kita ketahui pengguna komputer awam sangat jarang yang menginstall editor pdf di komputernya, pada umumnya mereka memiliki editor word.

Langsung saja, pertama yang kita perlukan adalah library phpoffice/phpword. Install ke Yii2 menggunakan composer

composer require phpoffice/phpword:"*"

Tidak lupa kita tentukan template word yang dapat digunakan. Misal, template akan diisikan nama pengguna dan tanggal ketika file word tersebut diunduh.

Dapat diperhatikan ada dua “kata” yang tidak biasa, yaitu ${tanggalSurat} dan ${nama} kedua “kata” tersebut akan diubah oleh sistem saat pengguna mengunduh file word yang menggunakan template tersebut.

Tentu saja template word diatas harus diunggah ke server dan dapat diakses oleh Yii2. Saat pengguna mengunduh file word, Yii2 juga harus menentukan template mana yang akan digunakan. Tentang hal itu tidak akan dibahas di tutorial ini.

Langkah berikutnya adalah membuat action untuk mengunduh file word pada sebuah controller yang akan diakses oleh pengguna.

public function actionUnduhSurat()
{
	// Ambil template
	$fileTemplateWord = Yii::$app->basePath.'/web/upload/template_surat.docx';
	// Gunakan template prosesor
	$templateProcessor = new TemplateProcessor($fileTemplateWord);
	// Set value semua variabel yang ada di template
	$templateProcessor->setValue('tanggalSurat',date('j M Y');
	$templateProcessor->setValue('nama',Yii:$app->user->identity->nama);
	// Save file word di folder temporary server
	$temp_file_word = tempnam(sys_get_temp_dir(), 'PHPWord');
	$templateProcessor->saveAs($temp_file_word);
	// Kirimkan file untuk didownload oleh pengguna
	$filename = "Surat_Tugas.docx";
	header('Content-Description: File Transfer');
	header('Content-Type: application/octet-stream');
	header('Content-Disposition: attachment; filename='.$filename);
	header('Content-Transfer-Encoding: binary');
	header('Expires: 0');
	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
	header('Pragma: public');
	header('Content-Length: ' . filesize($temp_file_word));
	flush();
	readfile($temp_file_word);
	// Hapus file word dari folder temporary server
	unlink($temp_file_word);
}