受注マスターにて配送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の機能やデザインのカスタマイズ承ります。