Récemment, dans un projet sur Laravel + Eloquent, j'avais besoin de réaliser des formulaires imprimables de documents - factures, contrats au format Word. Puisqu'il existe de nombreux documents différents dans le système, j'ai décidé de le rendre universel afin qu'il puisse être utilisé plus tard dans d'autres projets.
Le résultat est une mise en œuvre qui nécessite un minimum de coûts d'intégration dans le projet.
Comme je faisais des formulaires imprimables. Utilisé différentes approches
- .
- .
- 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}
.
Maintenant que le document est décrit, il ne reste plus qu'à commencer à générer le document imprimable
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);
Le fichier généré $tempFileName
contiendra un imprimable préparé.
Dans un projet Laravel, la méthode de contrôleur responsable de la génération de l'imprimable pourrait ressembler à ceci
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();
}
En résumé, je dirai que je me suis décemment déchargé en créant cette petite bibliothèque dans un projet avec beaucoup de formulaires imprimables. Je n'ai pas besoin d'écrire mon propre code pour chacun d'eux. Je décris simplement les variables comme ci-dessus et j'obtiens le résultat très rapidement. Je serai heureux si le package vous aidera à gagner du temps.