Baru-baru ini, dalam sebuah proyek di Laravel + Eloquent, saya perlu membuat bentuk dokumen yang dapat dicetak - faktur, kontrak dalam format Word. Karena ada banyak dokumen berbeda di dalam sistem, saya memutuskan untuk membuatnya secara universal agar nanti bisa digunakan di proyek lain.
Hasilnya adalah implementasi yang membutuhkan biaya minimum untuk diintegrasikan ke dalam proyek.

Seperti yang biasa saya lakukan untuk membuat formulir yang dapat dicetak. Menggunakan pendekatan yang berbeda
- Menempatkan tag di templat dokumen dan menggantinya selama pembuatan.
- .
- html word.
- , , .
. Eloquent, , .
,
composer require mnvx/eloquent-print-form
Eloquent, . , .
use Illuminate\Database\Eloquent\Model;
/**
* @property string $number
* @property string $start_at
* @property Customer $customer
* @property ContractAppendix[] $appendixes
*/
class Contract extends Model
{
public function customer()
{
return $this->belongsTo(Customer::class);
}
public function appendixes()
{
return $this->hasMany(ContractAppendix::class);
}
}
/**
* @property string $name
* @property CustomerCategory $category
*/
class Customer extends Model
{
public function category()
{
return $this->belongsTo(CustomerCategory::class);
}
}
/**
* @property string $number
* @property string $date
* @property float $tax
*/
class ContractAppendix extends Model
{
public function getTaxAttribute()
{
$tax = 0;
foreach ($this->items as $item) {
$tax += $item->total_amount * (1 - 100 / (100+($item->taxStatus->vat_rate ?? 0)));
}
return $tax;
}
}
,

(Contract), (Customer), . (ContractAppendix).
â . docx

Eloquent. , , , ${customer.category.name}.
, |, ${number|placeholder}. , , ${start_at|date|placeholder}.
placeholderâ "____",dateâ 24.12.2020,dateTimeâ - 24.12.2020 23:11,intâ 2`145,decimalâ 2`145.07.
. ${entities.#row_number}.
Sekarang setelah dokumen dijelaskan, tinggal mulai menghasilkan yang dapat dicetak
use Mnvx\EloquentPrintForm\PrintFormProcessor;
$entity = Contract::find($id);
$printFormProcessor = new PrintFormProcessor();
$templateFile = resource_path('path_to_print_forms/your_print_form.docx');
$tempFileName = $printFormProcessor->process($templateFile, $entity);
File yang dihasilkan $tempFileNameakan berisi siap cetak.
Dalam proyek Laravel, metode pengontrol yang bertanggung jawab untuk menghasilkan cetakan mungkin terlihat seperti ini
public function downloadPrintForm(FormRequest $request)
{
$id = $request->get('id');
$entity = Contract::find($id);
$printFormProcessor = new PrintFormProcessor();
$templateFile = resource_path('path_to_print_forms/your_print_form.docx');
$tempFileName = $printFormProcessor->process($templateFile, $entity);
$filename = 'contract_' . $id;
return response()
->download($tempFileName, $filename . '.docx')
->deleteFileAfterSend();
}
Kesimpulannya, saya akan mengatakan bahwa saya dengan sopan melepaskan diri dengan membuat perpustakaan kecil ini dalam sebuah proyek dengan banyak bentuk yang dapat dicetak. Saya tidak perlu menulis kode unik saya sendiri untuk masing-masing. Saya hanya menggambarkan variabel seperti di atas dan mendapatkan hasilnya dengan sangat cepat. Saya akan senang jika paket akan membantu Anda menghemat waktu.