バージョン選択

フォーラム

メニュー

オンライン状況

53 人のユーザが現在オンラインです。 (40 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 53
もっと...

サイト内検索

質問 > 管理機能 > フロントページで帳票出力を行いたい

管理機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
h_tanaka
投稿日時: 2018/3/15 15:23
対応状況: 解決済
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
フロントページで帳票出力を行いたい
EC-CUBE3.0.15

Form を画面に表示することなく使用することはできますでしょうか?

帳票出力プラグインを使用して、フロントページの注文履歴詳細ページでも領収書を発行できるようにしたいと考えております。

管理者側の処理をコピーして処理を作成しているのですが、$form->isValid() 判定が false になってしまいます。
バリデーションエラーの内容を出力してみようとすると、エラーメッセージが何も出力されませんでした。

app/template/default/Mypage/history.twig
                    {% if Order.CustomerOrderStatus == "発送済み" %}
                        <dt id="detail_box__commit_date">領収書:</dt>
                        <dd><a href="{{ url('plugin_order_pdf_download_receipt', { orderId : Order.id }) }}">発行</a></dd>
                    {% endif %}


app/Plugin/OrderPdf/ServiceProvider/OrderPdfServiceProvider.php
        // 領収書PDFファイルダウンロード
        $app->match('/mypage/history/download_receipt/{orderId}', '\\Plugin\\OrderPdf\\Controller\\OrderPdfController::download_receipt')
            ->bind('plugin_order_pdf_download_receipt')->assert('orderId', '\d+');


app/Plugin/OrderPdf/Controller/OrderPdfController.php
    public function download_receipt(Application $app, Request $request, $orderId)
    {

        $Order = $app['eccube.repository.order']->find($orderId);
        if ($Order == null) {
            throw new BadRequestHttpException();
        }

        /**
         * @var FormBuilder $builder
         */
        $builder = $app['form.factory']->createBuilder('admin_order_pdf');

        /* @var Form $form */
        $form = $builder->getForm();
        // $form->handleRequest($request);    // ★ この処理は不要?
        $form->get('ids')->setData($orderId);
        $form->get('title')->setData('領収書');
        $form->get('tyohyo_type')->setData('4');
        $form->get('ryosyu_no')->setData($Order->getOrderCode());
        $form->get('ryosyu_tadasi')->setData('商品代として');

        // Validation
        if (!$form->isValid()) {    // ★ バリデーションでエラーになってしまう
            log_info('The parameter is invalid!');
echo 1;
dump($form->getErrors(true));    // ★ エラーメッセージが出力されない
die;

            return $app->redirect($app->url('mypage_history', array('id' => $orderId)));
        }

        // サービスの取得
        /* @var OrderPdfService $service */
        $service = $app['orderpdf.service.order_pdf'];

        $arrData = $form->getData();    // ★ if (!$form->isValid()) {...} をコメントアウトしてみたところ、$arrData が null になってしまう

        // 購入情報からPDFを作成する
        $status = $service->makePdf($arrData);

        // 異常終了した場合の処理
        if (!$status) {
            log_info('Unable to create pdf files! Process have problems!');
echo 2;
die;

            return $app->redirect($app->url('mypage_history', array('id' => $orderId)));
        }

        // ダウンロードする
        $response = new Response(
            $service->outputPdf(),
            200,
            array('content-type' => 'application/pdf')
        );
echo 3;
die;

        // レスポンスヘッダーにContent-Dispositionをセットし、ファイル名をreceipt.pdfに指定
        $response->headers->set('Content-Disposition', 'attachment; filename="'.$service->getPdfFileName().'"');
        log_info('ReceiptPdf download success!', array('Order ID' => implode(',', $this->getIds($request))));

        return $response;
    }


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

k-yamamura
投稿日時: 2018/3/15 16:22
対応状況: −−−
一人前
登録日: 2015/7/8
居住地:
投稿: 72
Re: フロントページで帳票出力を行いたい
h_tanaka 様

ソースを記述する場所は異なりますが帳票出力をフロントでできる方法をまとめてみましたので参考にしてください。

http://amidaike.hatenablog.com/entry/2018/03/15/161235
h_tanaka
投稿日時: 2018/3/15 16:28
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: フロントページで帳票出力を行いたい
k-yamamura 様
ありがとうございます!
こんな記事を書いておられたのですね。
なるほど、arrData をパラメーターに渡せばいいので、Form を使わなくてもよかったのですね。。
目からウロコです。

ただ、ご回答いただいて大変恐縮なのですが、こちらどうしてもエラーが解消できなかったので、注文履歴詳細画面に form をレンダリングすることで自力で解決いたしました。
ご提示いただいた実装より効率悪いですが。。

src/Eccube/Controller/Mypage/MypageController.php
        // 帳票出力
        $pdf_builder = $app['form.factory']->createBuilder('admin_order_pdf');
        $pdf_form = $pdf_builder->getForm();
        $pdf_form->get('ids')->setData($id);
        $pdf_form->get('issue_date')->setData(new \DateTime());
        $pdf_form->get('title')->setData('領収書');
        $pdf_form->get('message1')->setData('このたびはお買上げいただきありがとうございます。');
        $pdf_form->get('message2')->setData('下記の内容にて納品させていただきます。');
        $pdf_form->get('message3')->setData('ご確認くださいますよう、お願いいたします。');
        $pdf_form->get('note1')->setData('');
        $pdf_form->get('note2')->setData('');
        $pdf_form->get('note3')->setData('');
        $pdf_form->get('comment1')->setData('下記の通り、お見積り申し上げます。');
        $pdf_form->get('comment2')->setData('納入期限:注文後1週間以内');
        $pdf_form->get('comment3')->setData('納入場所:御社指定');
        $pdf_form->get('comment4')->setData('支払条件:末〆翌月末振込');
        $pdf_form->get('comment5')->setData('有効期限:30日');
        $pdf_form->get('seikyu1')->setData('このたびはお買上げいただきありがとうございます。');
        $pdf_form->get('seikyu2')->setData('下記の内容にてご請求させていただきます。');
        $pdf_form->get('seikyu3')->setData('ご確認くださいますよう,お願いいたします。');
        $pdf_form->get('tyohyo_type')->setData('4');
        $pdf_form->get('ryosyu_no')->setData($Order->getOrderCode());
        $pdf_form->get('ryosyu_show')->setData('2');
        $pdf_form->get('ryosyu_tadasi')->setData('商品代として');

        return $app->render('Mypage/history.twig', array(
            'Order' => $Order,
            'pdf_form' => $pdf_form->createView(),
        ));


app/template/default/Mypage/history.twig
    {% if Order.CustomerOrderStatus == "発送済み" %}
        <div id="detail_box" class="row">
            <div id="detail_box__commit_date"></dt>
                <form role="form" name="order_pdf_form" id="order_pdf_form" method="post" action="{{ url('plugin_order_pdf_download_receipt', { orderId : Order.id }) }}">
                    <div class="btn_group col-sm-4">
                        <button class="btn btn-info btn-block" onclick="document.order_pdf_form.submit();">領収書発行
                        </button>
                    </div>
                    <span style="display:none;">{{ form_rest(pdf_form) }}</span>
                </form>
            </div>
        </div>
    {% endif %}


app/Plugin/OrderPdf/ServiceProvider/OrderPdfServiceProvider.php
        // 領収書PDFファイルダウンロード
        $app->match('/mypage/history/download_receipt/{orderId}', '\\Plugin\\OrderPdf\\Controller\\OrderPdfController::download_receipt')
            ->bind('plugin_order_pdf_download_receipt')->assert('orderId', '\d+');


app/Plugin/OrderPdf/Controller/OrderPdfController.php
    /**
     * フロントのマイページ購入履歴詳細で領収書発行ボタンクリック時の処理
     * 領収書のPDFをダウンロードする.
     *
     * @param Application $app
     * @param Request     $request
     *
     * @return Response
     *
     * @throws BadRequestHttpException
     */
    public function download_receipt(Application $app, Request $request, $orderId)
    {

        $Order = $app['eccube.repository.order']->find($orderId);
        if ($Order == null) {
            throw new BadRequestHttpException();
        }

        /**
         * @var FormBuilder $builder
         */
        $builder = $app['form.factory']->createBuilder('admin_order_pdf');

        /* @var Form $form */
        $form = $builder->getForm();
        $form->handleRequest($request);

        // Validation
        if (!$form->isValid()) {
            log_info('The parameter is invalid!');

            return $app->redirect($app->url('mypage_history', array('id' => $orderId)));
        }

        // サービスの取得
        /* @var OrderPdfService $service */
        $service = $app['orderpdf.service.order_pdf'];

        $arrData = $form->getData();

        // 購入情報からPDFを作成する
        $status = $service->makePdf($arrData);

        // 異常終了した場合の処理
        if (!$status) {
            log_info('Unable to create pdf files! Process have problems!');

            return $app->redirect($app->url('mypage_history', array('id' => $orderId)));
        }

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

        // レスポンスヘッダーにContent-Dispositionをセットし、ファイル名をreceipt.pdfに指定
        $response->headers->set('Content-Disposition', 'attachment; filename="'.$service->getPdfFileName().'"');
        log_info('ReceiptPdf download success!', array('Order ID' => implode(',', $this->getIds($request))));

        return $response;
    }


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

minori
投稿日時: 2018/3/16 18:15
対応状況: −−−
常連
登録日: 2017/10/12
居住地:
投稿: 40
Re: フロントページで帳票出力を行いたい
ご提示いただいている実装だと、
セキュリティの面では懸念が残るように思います。

画面から送信された値がそのまま帳票に出力されてしまうので、
悪意あるユーザーによって出力内容を書き換えることができてしまうのではないでしょうか?

エラーの内容がわかりませんが、入力値を使わないのであれば
Formを使わずに実装するのがベストだと思います。

また、受注データを取得する際には
ログインユーザーIDも検索条件に入れた方が安全です。
h_tanaka
投稿日時: 2018/3/16 18:18
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: フロントページで帳票出力を行いたい
k-yamamura様、minori様

ありがとうございます。
k-yamamura様ご提示の実装方法でうまく再実装することができました。


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,286名です
総投稿数は109,688件です

投稿数ランキング

1
seasoft
7365
2
468
3217
3
AMUAMU
2712
4
nanasess
2303
5
umebius
2085
6
yuh
1818
7
h_tanaka
1610
8
red
1567
9
mcontact
1240
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
796
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.