バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

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

管理機能

新規スレッドを追加する

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
h_tanaka
投稿日時: 2018/1/25 17:30
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: 配送CSVをダウンロード後に受注ステータス変更したい
tsuji 様

ご指定の場所に処理を入れてみたのですが、上記と同じORMInvalidArgumentExceptionが発生してしまいます。

発生箇所は、次の処理のタイミングのようです。
$orderRepository->changeStatus($val['id'], $Status);


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

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

↓の★4に入れてみてはどうでしょうか?
ここであれば、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();

        // ★ 4 ここに処理を追加

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

        return $response;
    }


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

h_tanaka
投稿日時: 2018/1/18 10:47
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: 配送CSVをダウンロード後に受注ステータス変更したい
tsuji 様

上記 ★3 の箇所に次のコードを挿入してみたのですが、次のエラーになってしまいます。。

■エラー
[2018-01-18 10:16:52,243055] admin.ERROR [f448b3c3] [5892b798] [2] [LogListener:onKernelException:115] - Doctrine\ORM\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@000000007463c263000000007d60586b. 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. (uncaught exception) at /usr/home/fa2002002/html/vendor/doctrine/orm/lib/Doctrine/ORM/ORMInvalidArgumentException.php line 91 {"exception":"[object] (Doctrine\\ORM\\ORMInvalidArgumentException(code: 0): 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@000000007463c263000000007d60586b. 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 /usr/home/fa2002002/html/vendor/doctrine/orm/lib/Doctrine/ORM/ORMInvalidArgumentException.php:91)"} [GET, /ecadmin/order/export/shipping?, 210.131.156.102, https://livingut.shop/ecadmin/order, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36]

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

        $qb->select('o.id');

        if ($result = $qb->getQuery()->getResult(Query::HYDRATE_ARRAY)) {
            $orderRepository = $app['orm.em']->getRepository('Eccube\Entity\Order');
            $Status = $app['eccube.repository.order_status']->find(5);
            foreach ($result as $val) {
                $status = $this->getStatus($val['id'], $app);
                if (in_array($status, 1)) {
                    $orderRepository->changeStatus($val['id'], $Status);
                }
            }
        }


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

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

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

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


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

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

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


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

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


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

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


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

h_tanaka
投稿日時: 2018/1/10 16:07
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
配送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 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

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


 



ログイン


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

統計情報

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

投稿数ランキング

1
seasoft
7365
2
468
3217
3
AMUAMU
2712
4
nanasess
2303
5
umebius
2085
6
yuh
1818
7
h_tanaka
1610
8
red
1568
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.