バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

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

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
MPV
投稿日時: 2016/10/19 14:05
対応状況: −−−
仙人
登録日: 2011/3/27
居住地:
投稿: 309
EC-CUBE3.0.11 category.twigでの商品数判定につきまして
システム情報

EC-CUBE 3.0.11
サーバーOS Windows NT 6.2 build 9200 (Windows 8 Professional Edition) i586
DBサーバー MySQL 10.1.13-MariaDB
WEBサーバー Apache/2.4.17 (Win32) OpenSSL/1.0.2d PHP/5.6.23
PHP 5.6.23 (Core, bcmath, calendar, ctype, date, ereg, filter, ftp, hash, iconv, json, mcrypt, SPL, odbc, pcre, Reflection, session, standard, mysqlnd, tokenizer, zip, zlib, libxml, dom, PDO, bz2, SimpleXML, wddx, xml, xmlreader, xmlwriter, apache2handler, openssl, curl, fileinfo, gd, gettext, mbstring, exif, mysql, mysqli, Phar, pdo_mysql, pdo_pgsql, pdo_sqlite, pgsql, mhash)
HTTPユーザーエージェント Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:49.0) Gecko/20100101 Firefox/49.0

お世話になります。

カテゴリナビでカテゴリ毎の商品数が0の場合に
カテゴリを非表示にしたいため、表示判定を
以下の様に行っています。

app/template/default/Block/category.twig


{% macro tree(Category) %}
    {% dump(Category.id) %}
    {% dump(Category.name) %}
    {% dump(Category.CategoryCount.product_count|default(0)) %}

    {% if Category.CategoryCount.product_count|default(0) > 0 %}
      <li>
          <a href="{{ url('product_list') }}?category_id={{ Category.id }}">{{ Category.name }}</a>
          {% if Category.children|length > 0 %}
              <ul>
                  {% for ChildCategory in Category.children %}
                      {{ _self.tree(ChildCategory) }}
                  {% endfor %}
              </ul>
          {% endif %}
      </li>
    {% else %}
    {% endif %}
{% endmacro %}


EC-CUBE3.0.10では、dump出力も判定処理も
共にうまくいっていたのですが、EC-CUBE3.0.11に
バージョンアップしたところ、判定処理が
うまく動かなくなってしまいました。
カテゴリ毎の商品数が取得できないようです。

EC-CUBE3.0.10でのダンプは以下の通りです。

__string_template__3020333dd9452830c432087d4213fa00c8c6faeea32acf06aeabcbdff7ef7531 on line 69: 616 __string_template__3020333dd9452830c432087d4213fa00c8c6faeea32acf06aeabcbdff7ef7531 on line 73: "〇〇〇〇〇〇〇〇" __string_template__3020333dd9452830c432087d4213fa00c8c6faeea32acf06aeabcbdff7ef7531 on line 77: 0 __string_template__3020333dd9452830c432087d4213fa00c8c6faeea32acf06aeabcbdff7ef7531 on line 69: 574 __string_template__3020333dd9452830c432087d4213fa00c8c6faeea32acf06aeabcbdff7ef7531 on line 73: "△△△△△△△△" __string_template__3020333dd9452830c432087d4213fa00c8c6faeea32acf06aeabcbdff7ef7531 on line 77: 170

※カテゴリ名は伏せました。

こちらについても、先日当方が上げたスレッド

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

と同様に、symfonyのバージョン違いに起因するものでしょうか。
それとも、他の要因によるものでしょうか?

dumpも出ないので、しばらくVer.3.0.10で様子見したほうが
よろしいでしょうか・・・。

大変恐縮ですが、何か情報等ございましたら
お教え頂ければ幸いです。

どうぞよろしくお願いいたします。<(_ _)>
MPV
投稿日時: 2016/10/19 15:07
対応状況: −−−
仙人
登録日: 2011/3/27
居住地:
投稿: 309
Re: EC-CUBE3.0.11 category.twigでの商品数判定につきまして
自レスで恐縮です。

当方その後確認しましたところ、判定処理が
まずかったようで、親カテゴリの数が取得できずに
表示ができていなかったようです。

それでどうしようかと思ったところ、以下スレッドを
拝見しました。勉強&調査不足でした。
申し訳ありません。

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

CategoryTotalCountは使用できなくなったのですね。

子カテゴリはCategoryCountからカテゴリ毎の数が
取得できるようですが、(但しVer.3.0.10だけしか
うまくいきませんでした。)Ver.3.0.11で
各カテゴリの商品数の取得方法はどうすれば
できるのでしょうか?

どなたか、Ver.3.0.11でカテゴリ内商品数で
判定する方法をご存知もしくは実践された方が
いらっしゃいましたら、どうかご教授頂けないでしょうか。

あとはメンテナンス性が悪いですが、カテゴリIDで
表示非表示を判定するくらいしか当方は思いつかず・・・(T_T)

スレ汚しで申し訳ありませんが、
どうぞよろしくお願いいたします。
nanasess
投稿日時: 2016/10/19 15:19
対応状況: −−−
登録日: 2006/9/9
居住地:
投稿: 2313
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
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 19:16
対応状況: −−−
登録日: 2006/9/9
居住地:
投稿: 2313
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 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に差し戻して確認しています。
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様のコードであればきちんと取得できることが
確認できましたので、このスレッドは解決済みにします。

どうもありがとうございました。<(_ _)>
nanasess
投稿日時: 2016/10/20 10:31
対応状況: −−−
登録日: 2006/9/9
居住地:
投稿: 2313
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/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/11/7 10:59
対応状況: −−−
登録日: 2006/9/9
居住地:
投稿: 2313
Re: EC-CUBE3.0.11 category.twigでの商品数判定につきまして
category_id=30 直下の商品しか取得できないのが原因ですね。

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

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


 



ログイン


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

統計情報

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

投稿数ランキング

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
1291
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.