質問 > フロント機能 > Processor改造時のRepositoryの使用方法につきまして[規格によらず在庫を増減させる] |
フロント機能
スレッド表示 | 古いものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
takax3 |
投稿日時: 2021/3/24 16:23
対応状況: 解決済
|
新米 登録日: 2021/3/21 居住地: 投稿: 3 |
Re: Processor改造時のRepositoryの使用方法につきまして __constructを以下の通りに書き換えたところ、在庫が規格によらず一括で減少する動作を実装出来ました。
ありがとうございました。 /** * StockReduceProcessor constructor. * * @param ProductStockRepository $productStockRepository * @param EntityManagerInterface $entityManager * @param ProductRepository $productRepository */ public function __construct(ProductStockRepository $productStockRepository, EntityManagerInterface $entityManager, ProductRepository $productRepository) { $this->productRepository = $productRepository; $this->productStockRepository = $productStockRepository; $this->entityManager = $entityManager; } |
umebius |
投稿日時: 2021/3/24 0:01
対応状況: −−−
|
神 登録日: 2016/7/22 居住地: 投稿: 2085 |
Re: Processor改造時のRepositoryの使用方法につきまして productRepositoryへの依存性注入は__constructならこんなふうに行うと良いですが、それはされていますか?
https://github.com/ec-cube/ec-cube/blob/4.0.5/src/Eccube/Twig/Extension/EccubeExtension.php#L46-L50 「use Eccube\Repository\ProductRepository;」も必要です。 https://github.com/ec-cube/ec-cube/blob/4.0.5/src/Eccube/Twig/Extension/EccubeExtension.php#L20
|
takax3 |
投稿日時: 2021/3/21 18:46
対応状況: −−−
|
新米 登録日: 2021/3/21 居住地: 投稿: 3 |
Re: Processor改造時のRepositoryの使用方法につきまして エラーが発生するのは
$Product = $this->productRepository->find($ProductId); の行です。それ以降は検証できていません。 最初はproductRepositoryがnullだからfindが存在しないのかな、などと__constructでproductRepositoryを持ってくるよう更新したのですが、どうにもうまくいかず…… |
takax3 |
投稿日時: 2021/3/21 18:44
対応状況: 解決済
|
新米 登録日: 2021/3/21 居住地: 投稿: 3 |
Processor改造時のRepositoryの使用方法につきまして[規格によらず在庫を増減させる] EC-CUBE 4.0.5です。初心者です。
商品に対して規格[包装あり, 包装無し]を設定した際、包装アリ購入時にも包装無し購入時にも両方の在庫が減少するよう改造を行いたく、StockReduceProcessor.phpのeachProductOrderItems関数を以下のように改造したのですが、いざ購入処理を行うとエラーが出てしまいます。 __constructにて$this->productRepository = $this->services['Eccube\\Repository\\ProductRepository'];などを行ってみたのですが、どうにもエラーを解消することができません。 もしよろしければ、productRepositoryを使用する方法、もしくはproductRepositoryを使用せずにstockを増減させる方法についてご教授願えないでしょうか。 よろしくお願いいたします。 private function eachProductOrderItems(ItemHolderInterface $itemHolder, callable $callback) { // Order以外の場合は何もしない if (!$itemHolder instanceof Order) { return; } foreach ($itemHolder->getProductOrderItems() as $item) { // 在庫が無制限かチェックし、制限ありなら在庫数をチェック if (!$item->getProductClass()->isStockUnlimited()) { // 在庫チェックあり /* @var ProductStock $productStock */ $productStock = $item->getProductClass()->getProductStock(); if ($productStock->getProductClassId() === null) { // 在庫に対してロックを実行 $this->entityManager->lock($productStock, LockMode::PESSIMISTIC_WRITE); $this->entityManager->refresh($productStock); $productStock->setProductClassId($item->getProductClass()->getId()); } $ProductClass = $item->getProductClass(); $stock = $callback($productStock->getStock(), $item->getQuantity()); if ($stock < 0) { throw new ShoppingException(trans('purchase_flow.over_stock', ['%name%' => $ProductClass->formattedProductName()])); } $productStock->setStock($stock); $ProductClass->setStock($stock); $ProductId = $ProductClass->getProduct()->getId(); $Product = $this->productRepository->find($ProductId); $ProductClasses = $Product->getProductClasses(); foreach($ProductClasses as $ProductClass) { $productStock = $ProductClass->getProductStock(); $productStock->setStock($stock); $ProductClass->setStock($stock); } } } } |
スレッド表示 | 古いものから | 前のトピック | 次のトピック | トップ |