バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

 > フロント機能 > EC-CUBE3.0.11 category.twigでの商品数判定につきまして

フロント機能

新規スレッドを追加する

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
YOKO
投稿日時: 2018/3/2 15:22
対応状況: 解決済
新米
登録日: 2011/3/16
居住地: 新潟県
投稿: 9
Re: EC-CUBE3.0.11 category.twigでの商品数判定につきまして
既に解決済みになっていますが、私もつい最近EC-CUBE3.0.15をいじりはじめて、同様な問題に直面し、このスレッドを発見いたしました。
nanasess様 の提示されているソースファイルに若干手を加えることで、子供を持ったカテゴリーの商品数の算出ができましたので、書き込ませていただきます。
returnの前に数行追加してみました。


public function publishCount()
    {
        $result = array_reduce(
            array_map(
                function ($ProductCategory) {
                    $Product = $ProductCategory->getProduct();
                    if (\Eccube\Util\EntityUtil::isNotEmpty($Product) && $Product->getStatus()->getId() === 1) {
                        return 1;
                    } else {
                        return 0;
                    }
                }, $this->ProductCategories->toArray()),
            function ($carry, $item) {
                return $carry += $item;
            }
        );

        // ▼▼▼▼ 追加 ここから ▼▼▼▼
        $arrayCategory = $this->Children;
        if (count($arrayCategory)) {
            foreach ($arrayCategory as $category) {
                $result += $category->publishCount();
            }
        }
        // ▲▲▲▲ 追加 ここまで ▲▲▲▲

        return $result ? $result : 0;
    }


以上です。
MPV
投稿日時: 2016/11/12 11:22
対応状況: 解決済
仙人
登録日: 2011/3/27
居住地:
投稿: 309
Re: EC-CUBE3.0.11 category.twigでの商品数判定につきまして
nanasess様

お返事が遅れまして申し訳ありませんでした。

引用:
ここまでちゃんとやろうとすると、 getSelfAndDescendants() というので配下のカテゴリまで取得して、商品を取得して、、となるので、ちょっとこのスペースでサンプルコードを提示するのは難しいです。 また、相当重くなると思いますので、再帰クエリを使用するなり、もうちょっと根本的に検討した方が良いと思います。


仰られる通りだと思います。
実際かなり重く、TEST環境で
表示時間がtotaltime 約20000msです(T_T)

ですので仕様を再度検討しまして、
カテゴリコンテンツプラグインを流用して
各カテゴリ毎に公開、非公開フラグを持たせては
どうかと思い、今プラグインを改修しています。
(カテゴリ毎であれば件数も少なく、ループする
必要もなくなりますので)

DBへの項目追加、及びフォームへの項目追加、
フラグが更新登録できるところまでは
勉強しながらなんとかできました。

あとは、app/template/default/Block/category.twigで
plg_category_contentを参照する方法が
わかっておらず躓いておりますが、これができれば
なんとかなるのではないかなと思っています。
勉強しつつやってみます。
(誠に勝手なお願いですが、もしヒントを頂ければ
幸いですが・・・。)

nanasess様にはいつも良いご助言やご回答を頂いておりまして
誠に恐縮です。ありがとうございました。<(_ _)>

先のnanasess様のご助言までで、本スレッドは回答済みに
させて頂きます。

【2016/11/18 追記】
おかげさまで、plg_category_contentを参照する方法が
わかりました。

こちらのスレッドを参考にさせて頂きました。
http://xoops.ec-cube.net/modules/newbb/viewtopic.php?viewmode=flat&topic_id=16622&forum=13

いろいろネットで検索し、以下の様にしました。

?別途カテゴリメニューブロックを追加するための
 プラグインを追加
?追加したプラグインのControllerでplg_category_contentを
 取得し、twigのパラメータに追加
?twigの中で、パラメータでループ処理する
 (ループする必要がありました。失礼しました。)
?ループして同じカテゴリIDの公開フラグを取得する
?公開フラグでカテゴリを表示するための判定を行う

まだまだ未熟ですので、たぶんもっといい方法が
あるかと思いますが、調べていく過程で
いろいろと勉強になりました。
(プラグイン作成、querybuilderなど)

nanasess様はじめ、ネットでいろいろと情報を
上げてくださっていた皆様方、誠にありがとうございました。
<(_ _)>
nanasess
投稿日時: 2016/11/7 10:59
対応状況: −−−
登録日: 2006/9/9
居住地:
投稿: 2314
Re: EC-CUBE3.0.11 category.twigでの商品数判定につきまして
category_id=30 直下の商品しか取得できないのが原因ですね。

ちゃんとやるには、再帰して、category_id=30 の場合は category_id=155, 156, 157 も取得するといったロジックにしなくてはなりません。

ここまでちゃんとやろうとすると、 getSelfAndDescendants() というので配下のカテゴリまで取得して、商品を取得して、、となるので、ちょっとこのスペースでサンプルコードを提示するのは難しいです。
また、相当重くなると思いますので、再帰クエリを使用するなり、もうちょっと根本的に検討した方が良いと思います。
MPV
投稿日時: 2016/11/7 10:15
対応状況: −−−
仙人
登録日: 2011/3/27
居住地:
投稿: 309
Re: EC-CUBE3.0.11 category.twigでの商品数判定につきまして
nanasess 様

お世話になります。
お返事が遅くなりましたこと、誠に申し訳ありませんでした。

商品件数が多かったので、てこずりましたが
ようやくCSVでのカテゴリ登録と商品登録が
できました・・・。

引用:
おそらく、 del_flg = 1 になっている商品があるのではないかなと思っています。


ご推察通り、削除済み商品もございます。
こちらにつきましても、削除フラグを立てて
そのままCSV登録しております。

EC-CUBE3.0.10インストール直後の状態から
規格を新たに登録し、カテゴリCSV登録と商品CSV登録を行って
ご教授頂きましたソースを追加した形で確認しましたところ、
以下の場合はきちんと商品件数が表示されます。

〇親カテゴリのみの場合
〇子カテゴリ

しかしながら、以下の場合は件数が0になってしまいます。

〇親カテゴリの下に子カテゴリが存在しており、
 子カテゴリ内に商品が存在する場合の親カテゴリ


<li>
    <a href="http://localhost/ec3/html/products/list?category_id=30">親カテゴリ【0】</a>
    <ul>
        <li>
            <a href="http://localhost/ec3/html/products/list?category_id=155">子カテゴリ1【28】</a>
        </li>
        <li>
            <a href="http://localhost/ec3/html/products/list?category_id=156">子カテゴリ2【26】</a>
        </li>
        <li>
            <a href="http://localhost/ec3/html/products/list?category_id=157">子カテゴリ3【9】</a>
        </li>
    </ul>
</li>


あと、予想されておりました通り表示時間はかかりますが、
ただこれはデバッグ用なので今のところ問題ないと
認識しております。

だいぶ時間が経ってしまいましたので、大変恐縮なのですが
上記の場合に件数が取れないのは、どういう要因が考えられるか
ご教授頂ければ幸いです。

失礼いたします。<(_ _)>
nanasess
投稿日時: 2016/10/20 10:31
対応状況: −−−
登録日: 2006/9/9
居住地:
投稿: 2314
Re: EC-CUBE3.0.11 category.twigでの商品数判定につきまして

    public function publishCount()
    {
        $result = array_reduce(
            array_map(
                function ($ProductCategory) {
                    $Product = $ProductCategory->getProduct();
                    if (\Eccube\Util\EntityUtil::isNotEmpty($Product) && $Product->getStatus()->getId() === 1) {
                        return 1;
                    } else {
                        return 0;
                    }
                }, $this->ProductCategories->toArray()),
            function ($carry, $item) {
                return $carry += $item;
            }
        );
        return $result ? $result : 0;
    }


で、どうでしょうか。
おそらく、 del_flg = 1 になっている商品があるのではないかなと思っています。
MPV
投稿日時: 2016/10/19 23:21
対応状況: −−−
仙人
登録日: 2011/3/27
居住地:
投稿: 309
Re: EC-CUBE3.0.11 category.twigでの商品数判定につきまして
nanasess様

大変申し訳ありませんでした。

EC-CUBE3.0.10のインストール直後の状態で
お教え頂きましたコードで確認しましたところ
きちんと取得ができました。

当方、EC-CUBE2系からのバージョンアップをしようとしており、
2系のDBテーブルから商品関連のテーブルをエクスポートして
3系のテーブルに合わせたデータをインポートして確認を
していたのですが、これが要因でエンティティがないという
エラーになってしまっているのかも知れません・・・。

DBのインポートではなく、商品とカテゴリをCSV登録しなおして
もう一度確認してみようと思います。

nanasess様のコードであればきちんと取得できることが
確認できましたので、このスレッドは解決済みにします。

どうもありがとうございました。<(_ _)>
MPV
投稿日時: 2016/10/19 20:22
対応状況: −−−
仙人
登録日: 2011/3/27
居住地:
投稿: 309
Re: EC-CUBE3.0.11 category.twigでの商品数判定につきまして
nanasess様

早々にお返事頂きまして、誠にありがとうございます。
お教え頂きました通りにやってみました。

ec3/src/Eccube/Entity/Category.phpの最後の方に


    /**
     * Get Creator
     *
     * @return \Eccube\Entity\Member
     */
     public function getCreator()
     {
         return $this->Creator;
     }

     /**
      * Get publishCount
      *
      * @return integer
      */
     public function publishCount()
     {
         $result = array_reduce(
             array_map(
                 function ($ProductCategory) {
                     $Product = $ProductCategory->getProduct();
                     if ($Product->getStatus()->getId() === 1) {
                         return 1;
                     } else {
                         return 0;
                     }
                 }, $this->ProductCategories->toArray()),
             function ($carry, $item) {
                 return $carry += $item;
             }
         );
         return $result ? $result : 0;
     }
  }


と、コードを追加しました。

そして、app/template/default/Block/category.twig に



{% macro tree(Category) %}
     <li>
         <a href="{{ url('product_list') }}?category_id={{ Category.id }}">
             {{ Category.name }}【{{ Category.publishCount }}】
         </a>



というように、カテゴリ名の横に公開商品数を表示させてみようと
しましたところ、やはり

Twig_Error_Runtime in Template.php line 396: An exception has been thrown during the rendering of a template ("Entity was not found.") in "__string_template__4b98462fe4bd8fa020a5f9c3d2c7e3b00fc5db6e7bc57dcafad4ec00331e165e" at line 26.

EntityNotFoundException in ProxyFactory.php line 177: Entity was not found.

というように、エンティティがないという
エラーが出てしまいます。(T_T)

今はEC-CUBE3.0.10に差し戻して確認しています。
nanasess
投稿日時: 2016/10/19 19:16
対応状況: −−−
登録日: 2006/9/9
居住地:
投稿: 2314
Re: EC-CUBE3.0.11 category.twigでの商品数判定につきまして
商品数が多くなると重いかもしれませんが、、、

src/Eccube/Entity/Category.php に、こんなメソッドを追加してやってください


    public function publishCount()
    {
        $result = array_reduce(
            array_map(
                function ($ProductCategory) {
                    $Product = $ProductCategory->getProduct();
                    if ($Product->getStatus()->getId() === 1) {
                        return 1;
                    } else {
                        return 0;
                    }
                }, $this->ProductCategories->toArray()),
            function ($carry, $item) {
                return $carry += $item;
            }
        );
        return $result ? $result : 0;
    }


そうすると、 category.twig では、こんな感じで公開商品数がとれるようになります


{{ Category.publishCount }}


商品数が多い場合は、 Doctrine\Common\Collections\Criteria というのを使うと良いと思います

Entity was not found. になるのは、削除された商品を見てしまっているのではないですかね。
MPV
投稿日時: 2016/10/19 18:13
対応状況: −−−
仙人
登録日: 2011/3/27
居住地:
投稿: 309
Re: EC-CUBE3.0.11 category.twigでの商品数判定につきまして
nanasess様

お世話になります。
ご無沙汰しております。

当方EC-CUBEの3系がはじめてなもので
なかなか難儀しております。
レベルが低いと思いますがどうかご容赦下さい。

引用:
Category.ProductCategories->count() で取得できると思います。 (厳密には親子関係を考慮しないといけませんが、表示非表示なら事足りるかと)


確認しようと思い、以下スレッドなども参考に
やってみたところ、

http://xoops.ec-cube.net/modules/newbb/viewtopic.php?viewmode=flat&topic_id=17216&forum=10

http://xoops.ec-cube.net/modules/newbb/viewtopic.php?viewmode=flat&topic_id=17269&forum=10

{{Category.ProductCategories|length}}


だと、カテゴリ内の全商品数が取得できるというところは
確認できたのですが、これから非公開の商品数を除いた商品数を
取得する方法はありますでしょうか?

上記の参考スレッドをもとに


{% for hoge in Category.ProductCategories %}
{% dump(hoge.Product.Status.id) %}
{% endfor %}


としてみたのですが、リレーションが切れているのか
エンティティがないというエラーが出て、表示されません。

An exception has been thrown during the rendering of a template ("Entity was not found.") in "__string_template__2e23597b4311956d7fbabe6c59ebd260f74e17842d3371a8b97030442dc41c9b" at line 32.

大変恐縮ですが、ご教授頂ければ幸いです。
何卒、よろしくお願いいたします。<(_ _)>

nanasess
投稿日時: 2016/10/19 15:19
対応状況: −−−
登録日: 2006/9/9
居住地:
投稿: 2314
Re: EC-CUBE3.0.11 category.twigでの商品数判定につきまして
Category.ProductCategories->count() で取得できると思います。
(厳密には親子関係を考慮しないといけませんが、表示非表示なら事足りるかと)

次のバージョンで改善される予定ですが、 fetch: EXTRA_LAZY にしないと、大量の商品を含むカテゴリを参照した場合は重くなりますのでご注意ください。

https://github.com/EC-CUBE/ec-cube/blob/1481ff4131adc3315208531663f8729db2ab5fd2/src/Eccube/Resource/doctrine/Eccube.Entity.Category.dcm.yml#L55
(1) 2 »
スレッド表示 | 古いものから 前のトピック | 次のトピック | トップ


 



ログイン


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

統計情報

総メンバー数は88,995名です
総投稿数は110,019件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2314
5
umebius
2085
6
yuh
1819
7
h_tanaka
1646
8
red
1570
9
mcontact
1296
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.