バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > フロント機能 > Processor改造時のRepositoryの使用方法につきまして[規格によらず在庫を増減させる]

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
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);
}
}
}
}
takax3
投稿日時: 2021/3/21 18:46
対応状況: −−−
新米
登録日: 2021/3/21
居住地:
投稿: 3
Re: Processor改造時のRepositoryの使用方法につきまして
エラーが発生するのは

$Product = $this->productRepository->find($ProductId);

の行です。それ以降は検証できていません。
最初はproductRepositoryがnullだからfindが存在しないのかな、などと__constructでproductRepositoryを持ってくるよう更新したのですが、どうにもうまくいかず……
umebius
投稿日時: 2021/3/24 0:01
対応状況: −−−
登録日: 2016/7/22
居住地: 東京日本橋
投稿: 2011
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


----------------
EC-CUBE4系 カスタマイズ ECのプロがシステム急ぎの案件承ります。
EC-CUBE開発 リモートで働くエンジニア募集中

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;
}
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

公式ストアEC-CUBE4系デザインテンプレート続々リリース中

統計情報

総メンバー数は72,220名です
総投稿数は101,641件です

投稿数ランキング

1
seasoft
7333
2
468
3034
3
AMUAMU
2712
4
nanasess
2156
5
umebius
2011
6
yuh
1612
7
red
1452
8
h_tanaka
1086
9
tsuji
936
10
fukap
907
11
shutta
835
12
tao_s
793
13 ramrun 789
14 karin 689
15 sumida 641
16
homan
633
17 DELIGHT 572
18
patapata
502
19
flealog
485
20 tonton 437


ネットショップの壺

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

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.