バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > その他 > ProductClass.php のgetPrice02()でProduct情報を使いたいです

その他

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
9-24
投稿日時: 2018/6/28 15:31
対応状況: −−−
新米
登録日: 2018/6/28
居住地:
投稿: 6
ProductClass.php のgetPrice02()でProduct情報を使いたいです
▼テンプレート
[EC-CUBE] 3,0.16 新規インストール
[レンタルサーバ] ローカル
[OS] WIN10
[PHP] 7.2.4
[データベース] mysql 5.0.12
[WEBサーバ] Apache 2.4.33
[ブラウザ] Edge
[導入プラグインの有無] ありません
[カスタマイズの有無] 初めてのカスタマイズです
[現象]

デバックモードでテストしています。
ProductClass.php の getPrice02() でProduct情報を使いたいと思っています。
ですが、

public function getPrice02()
{
dump($this->Product);

return $this->price02;
}

とすると2回まわっているようで、1回目がnull で2回目に情報が入っています。
試しに

public function getPrice02()
{
echo(sizeof($this));

return $this->price02;
}

とすると
「Warning: sizeof(): Parameter must be an array or an object that implements Countable」
の警告がでます。
色々調べていると、php7.2からの警告のような記事も見ましたが、どんなに試してみても2回目に入っているProduct情報を取り出せません。
私の勉強不足なのだと思いますが、沢山、試しているのですが、どうしても実現出来ないでいます。
どのようにすれば、getPrice02()の中で$this->Productの情報を扱うことが出来るでしょうか?
どうか、ご教授、お願いいたします。
x002dc
投稿日時: 2018/6/28 20:18
対応状況: −−−
半人前
登録日: 2018/6/27
居住地: 東京
投稿: 30
Re: ProductClass.php のgetPrice02()でProduct情報を使いたいです
同様の現象を見ると、商品詳細画面に遷移した時のお話だと思いますが、それぞれコール時の状態が異なるからかと。

1回目のコールは、

TaxRuleEventSubscriber#postLoad


2回目のコールは、

Eccube\Entity\Product#_calc


のようです。

※Procutからコールした場合にnullとならないのは、lazy loadされているからかと。


コール元は、以下のような感じで確認しました。

public function getPrice02()
{
$dbg = debug_backtrace();
dump($dbg[1]);
dump($this->Product);

return $this->price02;
}


getPrice02でのProductの利用方法がわかりませんが、単純に商品詳細の画面表示で使いたいだけであるなら、null判定でnullでない場合のみ処理してしまえば問題は発生しないと思います。


if(!is_null($this->getProduct())){
// 何らかの処理
}

もし、いずれの場合でもProductを取得したいのであれば、ちょっと強引ですが、getProduct() 内で、$this->Productをnull判定をした上でnullの場合は、ProductRepositoryからproduct_idをキーにProductを取得してしまえばいいのではないでしょうか。

※実際に試していないので、既存への影響は不明です。

参考になれば、幸いです。
9-24
投稿日時: 2018/6/29 12:54
対応状況: −−−
新米
登録日: 2018/6/28
居住地:
投稿: 6
Re: ProductClass.php のgetPrice02()でProduct情報を使いたいです
新米様、ご回答ありがとうございます。
何処をコールしているのかを知る方法があるとは知りませんでした。
なんとなく、何故違う結果が入っているのかは分る気がしました。

ですが、おそらく、私がCUBEというより、オブジェクト指向をよく理解出来ていないからだと思うのですが、

>product_idをキーに

getPrice02()においても、getProduct() においても、
「$product_id = $this->id;」
でproduct_idを取れるとことまでは分かります。
ですが、

>ProductRepositoryからproduct_idをキーにProductを取得

public function getProduct()
{
if(is_null($this->Product)){
$product_id = $this->id;
//これをどう扱えば良いのか分かりません
}
return $this->Product;
}

また、私の欲しい動きはgetPrice02()内でカテゴリ情報の”category_id”、”rank”の連想配列を取得してreturn $this->price02に変化をつけさせることなのですが、教えて頂いたことをヒントにgetPrice02()で直接情報を得れるかな?と試してみたのですが、

public function getPrice02()
{
$this->ProductCategories = new ProductCategory();
dump($this->ProductCategories);

return $this->price02;
}

としても、全てがnullの情報が2回まわるだけでした。
他にも思いつくだけ試してみたのですが、先にも書いた通り、私のオブジェクト指向への知識不足かと思いました。

こちらのサイトの質問の投稿の際に、他の方への知的財産の侵害にならないようにと注意を読みました。
皆さまにご迷惑の掛からないようにしなければ、と思うと、どのような形で質問して良いのか分かりませんし、もし私の欲しい回答がそれに該当するならご回答頂かなくてもどうにか頑張ろうと思います。

ですがもし、差支えの無い範囲の質問でしたら、ご回答頂けたらありがたく思います。
どうか、よろしくお願いします。
x002dc
投稿日時: 2018/6/29 18:40
対応状況: −−−
半人前
登録日: 2018/6/27
居住地: 東京
投稿: 30
Re: ProductClass.php のgetPrice02()でProduct情報を使いたいです
> おそらく、私がCUBEというより、オブジェクト指向をよく理解出来ていないからだと思うのですが、

オブジェクト指向もそうですが、EC CUBE3で利用されているフレームワーク(Symfony、doctrine、silexなど)を理解されてからカスタマイズされたほうが良いかと。。。

また、getPrice02はprice02のgetterにとどめておいて、価格を計算するのは計算用クラスなどを用意して、そちらで対応したほうがよいと思います。

getPrice02()をどうしても変更したいというのであれば、おすすめはしませんが無理やりProductの情報を取ることはできると思います。

1) Eccube.Entity.ProductClass.dcm.yml にproduct_id フィールドを追加
2) ProductClass.php に product_id のgetter/setter を追加
3) その上で、以下のようなコードでproductを取得できるかと。

if(is_null($this->Product)){
$app = Application::getInstance();
/** @var Product $Product */
$Product = $app['eccube.repository.product']->find($this->getProductId());
return $Product;
}

でも、やめたほうが懸命かと。。。
9-24
投稿日時: 2018/6/30 13:51
対応状況: 解決済
新米
登録日: 2018/6/28
居住地:
投稿: 6
Re: ProductClass.php のgetPrice02()でProduct情報を使いたいです
x002dc様

また回答をありがとうございます。

試しに頂いた回答をもとに、
1) Eccube.Entity.ProductClass.dcm.yml にproduct_id フィールドを追加
2) ProductClass.php に product_id のgetter/setter を追加
をしてみたのですが、この時点でエラーが出て、そのメッセージをネットで調べると
「Symfony2/Doctrineのドキュメントは~」という記事に当たったりしました。

>フレームワーク(Symfony、doctrine、silexなど)を理解されてからカスタマイズされたほうが良いかと。。。

まさしく、この通りで、感や手探りでカスタマイズ出来るものではないのだろうなと痛感しました。
Symfonyの参考書などを読み、ご指摘されたとおり

>価格を計算するのは計算用クラスなどを用意して

を実現出来るようにしたいと思います。

今回のx002dc様のご回答で、自分が何が分かっていないのかを含め、カスタマイズの足掛かりが少し見えたように思います。
大変、ありがとうございました。感謝いたします。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


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

統計情報

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

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2313
5
umebius
2085
6
yuh
1819
7
h_tanaka
1646
8
red
1570
9
mcontact
1294
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
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.