Druckbare Dokumentformulare für Eloquent in 0 Codezeilen

Kürzlich musste ich in einem Projekt zu Laravel + Eloquent druckbare Formen von Dokumenten erstellen - Rechnungen, Verträge im Word-Format. Da das System viele verschiedene Dokumente enthält, habe ich beschlossen, es universell zu gestalten, damit es später in anderen Projekten verwendet werden kann.



Das Ergebnis ist eine Implementierung, die ein Minimum an Kosten für die Integration in das Projekt erfordert.





Da habe ich druckbare Formulare gemacht. Verwendete verschiedene Ansätze



  • .
  • .
  • 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}.



Nachdem das Dokument beschrieben wurde, muss nur noch mit dem Generieren des Ausdrucks begonnen werden



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);


Die generierte Datei $tempFileNameenthält eine vorbereitete Druckversion.



In einem Laravel-Projekt sieht die Controller-Methode, die für die Erstellung des Ausdrucks verantwortlich ist, möglicherweise so aus



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();
}


Zusammenfassend möchte ich sagen, dass ich mich anständig entladen habe, indem ich diese kleine Bibliothek in einem Projekt mit vielen druckbaren Formularen erstellt habe. Ich muss nicht für jeden meinen eigenen eindeutigen Code schreiben. Ich beschreibe die Variablen einfach wie oben und erhalte das Ergebnis sehr schnell. Ich freue mich, wenn das Paket Ihnen hilft, Zeit zu sparen.



Link zum Projekt auf Github




All Articles