EC-CUBE4.0.3で注文完了時に今回注文データをCSVに出力する方法を調べています。
※PHP、EC-CUBEは今回初めて触り、フレームワークであるsymfonyの基礎は勉強し始めたばかりです。
カートの内容を確定時にテキストに書き出すロジックを、
「src\Eccube\Controller\ShoppingController.php」の
「public function checkout(Request $request)」内の
カート削除前に実装しました。
PHP
1// csvへの出力処理 2try { 3 //カートサービスよりカート情報を取得 4 $cartData = $this->cartService->getCart(); 5 //カート情報よりアイテム取得 6 $cartItems = $cartData->getItems(); 7 8 // 受注保存用ファイルオープン 9 $fhandle = fopen( $Order->getOrderNo()."_juchu_comp.csv", "a"); 10 11 if ($fhandle === false) { 12 log_error('[注文処理] 保存エラーが発生しました.'); 13 $this->entityManager->rollback(); 14 return $this->redirectToRoute('shopping_error'); 15 } 16 $outDateShare = $cartData->getCustomer()->getId().','; 17 $outDateShare .= $cartData->getCustomer()->getName01().','; 18 $outDateShare .= $cartData->getCustomer()->getEmail().','; 19 20 foreach ($cartItems as $cartitem) { 21 $outData = $outDateShare; 22 $outData .= $cartitem->getProductClass()->getCode().','; 23 $outData .= $cartitem->getProductClass()->getProduct()->getName().','; 24 $outData .= $cartitem->getQuantity().','; 25 $outData .= $cartitem->getPrice().','; 26 $outData .= PHP_EOL; 27 28 if (fwrite($fhandle, $outData) === false) { 29 log_error('[注文処理] 書き込みエラーが発生しました.'); 30 $this->entityManager->rollback(); 31 return $this->redirectToRoute('shopping_error'); 32 } 33 } 34 35 // ファイルを閉じる 36 fclose($fhandle); 37 catch (Exception $e) { 38 log_error('[注文処理] 保存処理エラーが発生しました.', [$e->getMessage()]); 39 $this->entityManager->rollback(); 40 $this->addError($e->getMessage()); 41 return $this->redirectToRoute('shopping_error'); 42} 43 44// カート削除 45log_info('[注文処理] カートをクリアします.', [$Order->getId()]); 46$this->cartService->clear();
ここでの処理は全て正常終了しますが、そのあと「システムエラー」となり以下のログが出力されます。調査又は見直すべき部分を教えてください。
log
1システムエラーが発生しました。 2["A new entity was found through the relationship 'Eccube\Entity\CartItem#Cart' that was not configured to cascade persist operations for entity: Eccube\Entity\Cart@000000002730a39b00000000111e5af7. 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\Cart#__toString()' to get a clue.", 3"C:\xampp\htdocs\eccube4\vendor\doctrine\orm\lib\Doctrine\ORM\ORMInvalidArgumentException.php",102," 4 #0 C:\xampp\htdocs\eccube4\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php(3443): Doctrine\ORM\ORMInvalidArgumentException::newEntitiesFoundThroughRelationships(Array)\n 5 #1 C:\xampp\htdocs\eccube4\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php(362): Doctrine\ORM\UnitOfWork->assertThatThereAreNoUnintentionallyNonPersistedAssociations()\n 6 #2 C:\xampp\htdocs\eccube4\vendor\doctrine\orm\lib\Doctrine\ORM\EntityManager.php(359): Doctrine\ORM\UnitOfWork->commit(NULL)\n#3 C:\xampp\htdocs\eccube4\var\cache\prod\ContainerCqirhhx\EntityManager_9a5be93.php(83): Doctrine\ORM\EntityManager->flush(NULL)\n 7 #4 C:\xampp\htdocs\eccube4\src\Eccube\Controller\ShoppingController.php(481): EntityManager_9a5be93->flush()\n 8 #5 C:\xampp\htdocs\eccube4\vendor\symfony\http-kernel\HttpKernel.php(151): Eccube\Controller\ShoppingController->checkout(Object(Symfony\Component\HttpFoundation\Request))\n 9 #6 C:\xampp\htdocs\eccube4\vendor\symfony\http-kernel\HttpKernel.php(68): Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object(Symfony\Component\HttpFoundation\Request), 1)\n 10 #7 C:\xampp\htdocs\eccube4\vendor\symfony\http-kernel\Kernel.php(200): Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)\n 11 #8 C:\xampp\htdocs\eccube4\index.php(76): Symfony\Component\HttpKernel\Kernel->handle(Object(Symfony\Component\HttpFoundation\Request))\n 12 #9 {main}"] [POST, /eccube4/shopping/checkout, ::1, http://localhost/eccube4/shopping/confirm, Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36]
回答1件
あなたの回答
tips
プレビュー