Elququentのためのゼロコード印刷フォーム


最近、ラービア+プロジェクトの印刷フォームを作成するために必要なプロジェクトで-請求書、ワード形式での契約.システムにはたくさんの異なるドキュメントがあるので、後で他のプロジェクトで使用できるようにユニバーサルにすることを決めました.
結果はプロジェクトに最小限の統合コストを必要とする実装です.
どのように私は印刷用紙を作るために使用.別のアプローチを使用
  • 私は、タグを文書テンプレートに置いて、世代の間、彼らを取り替えていました.
  • ドキュメントテキストをゼロから生成しました.
  • HTMLを生成し、それを単語に変換しました.
  • 私は、この記事で説明されたものと同様のドキュメントを生成するための私自身のシステムを作成していましたが、他のテクノロジーを使用していました.
  • それぞれのオプションはそのタスクに適しています.しかし、あなたが雄弁であるならば、私はこの記事で説明される方法を非常に推薦します.
    それで、我々はパッケージをつなぎます
    composer require mnvx/eloquent-print-form
    
    また,それらが既に記述されていない場合,雄弁なモデルを記述した.次のモデルがあるとしましょう.
    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} .
    ドキュメントが記述されたので、印刷されたフォームの生成を開始する必要があります
    use Mnvx\EloquentPrintForm\PrintFormProcessor;
    $entity = Contract::find($id);
    $printFormProcessor = new PrintFormProcessor();
    $templateFile = resource_path('path/your_print_form.docx');
    $tempFileName = $printFormProcessor
        ->process($templateFile, $entity);
    
    生成される$tempFileName ファイルに準備された印刷フォームが含まれます.
    Laravelプロジェクトでは、印刷フォームを生成するためのコントローラメソッドが次のようになります
    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();
    }
    
    要約すると、私は、この小さなライブラリを印刷フォームをたくさん持っているプロジェクトのために作ることによって、私自身を静かにアンロードすると言います.私はそれぞれの独自のコードを書く必要はありません.私は、上記のようにドキュメントの変数を記述し、結果を非常に迅速に得る.パッケージがあなたが時間を節約するのを助けるならば、私はうれしいです.
    Link to the project on github .