バージョン選択

フォーラム

メニュー

オンライン状況

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

PR

デザインテンプレート EC-CUBE3.0版が登場!
広告掲載について

サイト内検索

質問 > 管理機能 > 配送CSVをダウンロード後に受注ステータス変更したい

管理機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
h_tanaka
投稿日時: 2018/1/10 16:07
対応状況: −−−
仙人
登録日: 2016/7/22
居住地: 愛媛県
投稿: 359
配送CSVをダウンロード後に受注ステータス変更したい
受注マスターにて配送CSVをダウンロード後に受注ステータスを変更するような処理を実装することは可能でしょうか?

OrderController の exportShipping() 内に実装することで、受注ステータスを変更すること自体はできました。
しかし、配送CSVをダウンロード後というタイミングで処理を実行する方法がわかりません。。

src/Eccube/Controller/Admin/Order/OrderController.php
    public function exportShipping(Application $app, Request $request)
    {
        // タイムアウトを無効にする.
        set_time_limit(0);

        // sql loggerを無効にする.
        $em = $app['orm.em'];
        $em->getConfiguration()->setSQLLogger(null);

        // ★ 1.ここに処理を追加するとダウンロード前に実行される

        $response = new StreamedResponse();
        $response->setCallback(function () use ($app, $request) {

            // CSV種別を元に初期化.
            $app['eccube.service.csv.export']->initCsvType(CsvType::CSV_TYPE_SHIPPING);

            // ヘッダ行の出力.
            $app['eccube.service.csv.export']->exportHeader();

            // 受注データ検索用のクエリビルダを取得.
            $qb = $app['eccube.service.csv.export']
                ->getOrderQueryBuilder($request);

            // データ行の出力.
            $app['eccube.service.csv.export']->setExportQueryBuilder($qb);
            $app['eccube.service.csv.export']->exportData(function ($entity, $csvService) use ($app, $request) {

                $Csvs = $csvService->getCsvs();

                /** @var $Order \Eccube\Entity\Order */
                $Order = $entity;
                /** @var $Shippings \Eccube\Entity\Shipping[] */
                $Shippings = $Order->getShippings();

                foreach ($Shippings as $Shipping) {
                    /** @var $ShipmentItems \Eccube\Entity\ShipmentItem */
                    $ShipmentItems = $Shipping->getShipmentItems();
                    foreach ($ShipmentItems as $ShipmentItem) {
                        $ExportCsvRow = new \Eccube\Entity\ExportCsvRow();

                        // CSV出力項目と合致するデータを取得.
                        foreach ($Csvs as $Csv) {
                            // 受注データを検索.
                            $data = $csvService->getData($Csv, $Order);
                            $ExportCsvRow->setData('"' . $data . '"');
                            if (is_null($data)) {
                                // 配送情報を検索.
                                $data = $csvService->getData($Csv, $Shipping);
                                $ExportCsvRow->setData('"' . $data . '"');
                            }
                            if (is_null($data)) {
                                // 配送商品を検索.
                                $data = $csvService->getData($Csv, $ShipmentItem);
                                $ExportCsvRow->setData('"' . $data . '"');
                            }

                            $event = new EventArgs(
                                array(
                                    'csvService' => $csvService,
                                    'Csv' => $Csv,
                                    'ShipmentItem' => $ShipmentItem,
                                    'ExportCsvRow' => $ExportCsvRow,
                                    'data' => $data,
                                ),
                                $request
                            );
                            $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_ORDER_CSV_EXPORT_SHIPPING, $event);

                            $ExportCsvRow->pushData();
                        }
                        //$row[] = number_format(memory_get_usage(true));
                        // 出力.
                        $csvService->fputcsv($ExportCsvRow->getRow());
                    }
                }

                // ★ 2.ここに処理を追加するとCSVの行ごとに実行される

            });

            // ★ 3.ここに処理を追加するとダウンロードと同時に実行される

        });

        $now = new \DateTime();
        $filename = 'shipping_' . $now->format('YmdHis') . '.csv';
        $response->headers->set('Content-Type', 'application/octet-stream');
        $response->headers->set('Content-Disposition', 'attachment; filename=' . $filename);
        $response->send();

        log_info('配送CSV出力ファイル名', array($filename));

        return $response;
    }


src/Eccube/Service/CsvExportService.php
    public function exportData(\Closure $closure)
    {
        if (is_null($this->qb) || is_null($this->em)) {
            throw new \LogicException('query builder not set.');
        }

        $this->fopen();

        $query = $this->qb->getQuery();
        foreach ($query->getResult() as $iteratableResult) {
            $closure($iteratableResult, $this);
            $this->em->detach($iteratableResult);
            $query->free();
            flush();
        }

        $this->fclose();

        // ★ 4.ここに処理を追加すると次のエラー
        // ORMInvalidArgumentException
        // A new entity was found through the relationship 'Eccube¥Entity¥Shipping#Order'
        // that was not configured to cascade persist operations for entity: 
        // Eccube¥Entity¥Order@0000000008fb260f0000000002daf930.
        // To solve this issue: Either explicitly call EntityManager#persist()
        // on this unknown entity or configure cascade persist  this association in the mapping for example @ManyToOne(..
        // cascade={"persist"}). If you cannot find out which entity causes the problem implement 'Eccube¥Entity¥Order#__toString()' to get a clue.
        // at EntityManager->flush() in /usr/home/fa2002002/html/src/Eccube/Repository/OrderRepository.php line 64

    }


----------------
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

tsuji
投稿日時: 2018/1/11 11:14
対応状況: −−−
仙人
登録日: 2013/11/19
居住地:
投稿: 795
Re: 配送CSVをダウンロード後に受注ステータス変更したい
h_tanaka 様


試していないのでアイディアだけお伝えします。
setCallbackの後で、 受注データ検索用のクエリビルダを
取得・実行するとおなじ受注IDを取得することはできますので
それをもとに更新処理を行うのはどうでしょうか?

もしくは、あまり使いたくはないですが、
setCallback内でセッションに該当受注IDを設定し、setCallback実行後に
取り出して更新をかけるという方法もあるかと思います。


----------------
****************************************
株式会社システムフレンド
辻 拓也(takuya tsuji)
改造専門店・EC-CUBE工房
****************************************

h_tanaka
投稿日時: 2018/1/11 11:22
対応状況: −−−
仙人
登録日: 2016/7/22
居住地: 愛媛県
投稿: 359
Re: 配送CSVをダウンロード後に受注ステータス変更したい
tsuji 様
ご返信ありがとうございます。

setCallbackの後というのは上記コードの ★3 の箇所でしょうか?
ここに処理を追加するとダウンロード処理とほぼ同時のタイミングで実行されるため、10件の受注データのステータスを「新規受付」から「送信済み」に変更する処理を入れて試してみたところ、1件目が「新規受付」となり2件目以降が「送信済み」となります。
これを10件とも「新規受付」のままダウンロードし、ダウンロード後に10件を「送信済み」に変更したいと考えております。
このようなことは可能でしょうか?


----------------
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

tsuji
投稿日時: 2018/1/11 11:44
対応状況: −−−
仙人
登録日: 2013/11/19
居住地:
投稿: 795
Re: 配送CSVをダウンロード後に受注ステータス変更したい
h_tanaka 様

ダウンロード後ということであれば、
$response->send();になるかと思います。

検索結果に基づいてダウンロードを行っていると思いますので、
新たに$response->send();後に検索を行って
対象を取得するということになるかと思っています。


----------------
****************************************
株式会社システムフレンド
辻 拓也(takuya tsuji)
改造専門店・EC-CUBE工房
****************************************

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


 



ログイン


EC-CUBEペイメント

クレジットカード情報の非保持化対応

統計情報

総メンバー数は21,398名です
総投稿数は84,178件です

投稿数ランキング

1
seasoft
7331
2
AMUAMU
2712
3
nanasess
1672
4
yuh
1455
5
red
1093
6
fukap
907
7
shutta
827
8
468
817
9
umebius
814
10
tsuji
795
11 ramrun 789
12
tao_s
651
13 karin 642
14 sumida 638
15
homan
633
16 DELIGHT 571
17
patapata
502
18
flealog
483
19 tonton 436
20
ecbg
387


ネットショップの壺

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

Copyright© LOCKON CO.,LTD. All Rights Reserved.