EC-CUBE3で帳票プラグインを利用してフロントでも出力できるようにする方法

EC-CUBE3では帳票出力はプラグインとして提供されています。

管理画面からはプラグインをインストールするだけですぐに利用できますが、フロントからでも帳票を出力したいとう要望が時々あります。 帳票の内容が同じでよければ以下のように対応するだけで実現可能です。

前提として、帳票プラグインを有効にしておく必要がありますのでご注意ください。 対象バージョンはEC-CUBE3.0.15となりますが、他のバージョンでも動作すると思います。

  • src/Eccube/Resource/template/default/Mypage/index.twig の修正

マイページの購入一覧画面で帳票出力リンクを表示したい場合、以下のソースをデザインに合わせて適当な場所へ追加します。

{% if Order.OrderStatus.id == app.config.order_deliv %}
    <p><a href="{{ url('mypage_history_print', {'id': Order.id}) }}" target="print">帳票出力</a></p>
{% endif %}

if文を使っているのは、ステータスが発送済みの時だけ出力できるようにしています。

  • src/Eccube/Resource/template/default/Mypage/history.twig の修正

同様に購入履歴の詳細画面でも帳票出力リンクを用意します。

{% if Order.OrderStatus.id == app.config.order_deliv %}
    <p><a href="{{ url('mypage_history_print', {'id': Order.id}) }}" target="print">帳票出力</a></p>
{% endif %}

記述する内容は上記と同じです。

  • src/Eccube/ControllerProvider/FrontControllerProvider.php へURLを定義

帳票を出力すためのURL定義を行います。記述する場所はどこでも構いません。

$c->match('/mypage/history_print/{id}', '\Eccube\Controller\Mypage\MypageController::historyPrint')->bind('mypage_history_print');

ここの部分はプロジェクトに合わせて変更しても構いません。

  • src/Eccube/Controller/Mypage/MypageController.php へ帳票出力関数を追加

実際に帳票を出力するための関数を記述します。本来であればプラグインのものを再利用できれば良いのですが、色々と考慮する必要があるため新たに作成しています。

<?php
/**
 * 印刷画面を表示
 *
 * @param Application $app
 * @param Request $request
 * @param $id
 * @return \Symfony\Component\HttpFoundation\Response
 * @throws \Doctrine\ORM\OptimisticLockException
 */
public function historyPrint(Application $app, Request $request, $id)
{
    /* @var $softDeleteFilter \Eccube\Doctrine\Filter\SoftDeleteFilter */
    $softDeleteFilter = $app['orm.em']->getFilters()->getFilter('soft_delete');
    $softDeleteFilter->setExcludes(array(
        'Eccube\Entity\ProductClass',
    ));

    $app['orm.em']->getFilters()->enable('incomplete_order_status_hidden');

    /* @var $Order \Eccube\Entity\Order */
    $Order = $app['eccube.repository.order']->findOneBy(array(
        'id' => $id,
        'Customer' => $app->user(),
    ));

    if (!$Order) {
        throw new NotFoundHttpException();
    }

    // 発送済みしか表示させない
    if ($Order->getOrderStatus()->getId() != $app['config']['order_deliv']) {
        throw new AccessDeniedHttpException();
    }

    // 購入情報からPDFを作成する
    $arrData = array(
        'issue_date' => new \DateTime(),
        'ids' => $Order->getId(),
        'title' => 'XXXXX明細書',
        'message1' => 'このたびはお買上げいただきありがとうございます。',
        'message2' => '下記の内容にて納品させていただきます。',
        'message3' => 'ご確認くださいますよう、お願いいたします。',
        'note1' => '',
        'note2' => '',
        'note3' => '',
    );

    $status = $app['orderpdf.service.order_pdf']->makePdf($arrData);

    // 異常終了した場合の処理
    if (!$status) {
        throw new AccessDeniedHttpException();
    }

    // ダウンロードする
    $response = new Response(
        $app['orderpdf.service.order_pdf']->outputPdf(),
        200,
        array('content-type' => 'application/pdf')
    );

    // レスポンスヘッダーにContent-Dispositionをセットし、ファイル名を指定
    $response->headers->set('Content-Disposition', 'inline; filename="'.$app['orderpdf.service.order_pdf']->getPdfFileName().'"');
    // $response->headers->set('Content-Disposition', 'attachment; filename="'.$app['orderpdf.service.order_pdf']->getPdfFileName().'"');

    return $response;
}

上記を記述すると管理画面と同じ帳票が出力できるようになります。

下記の部分ですが、PDFをブラウザ上に表示させるか、ダウンロードさせたいかの違いだけですので、用途に合わせてコメントアウトを変更してください。

$response->headers->set('Content-Disposition', 'inline; filename="'.$app['orderpdf.service.order_pdf']->getPdfFileName().'"');
// $response->headers->set('Content-Disposition', 'attachment; filename="'.$app['orderpdf.service.order_pdf']->getPdfFileName().'"');

以上でフロントからでも帳票出力が可能となりますので、もしフロントでも帳票出力させたいという方は参考にしてください。