ECサイトでは商品があるカテゴリーに含まれるかどうかチェックして、ページごとに情報を変えるというカスタマイズを良く行います。EC-CUBE3やEC-CUBE4ではとても簡単に実現できるので、よくある確認方法をご紹介します。
今回は2つの方法をご紹介します。twigだけで完結する方法とエンティティファイルに便利なメソッドを追加する方法です。
twigファイルだけで完結する方法
twig内でもfor文とif文で商品がカテゴリに属しているかどうかを判断することができます。例はIDが2のカテゴリに属しているかどうかチェックしています。
{% set hasCategory = false %} {% for ProductCategory in Product.ProductCategories %} {% if ProductCategory.Category.id == 2 %} {% set hasCategory = true %} {% endif %} {% endfor %} {% if hasCategory %} {# カテゴリに属している #} {% else %} {# カテゴリに属していない #} {% endif %}
Entityにメソッドを追加する方法
Twig内だけで完結することもできるのですが、より使い回しが効くEntityにメソッドを追加の方法をご紹介します。今回は直接Entityにメソッドを追加していますが、4系ではCustomizeディレクトリにProductエンティティのTraitを追加する方が良いでしょう。
src/Eccube/Entity/Product.phpにメソッド追加
/** * 商品がカテゴリーに属しているかどうかチェックする 子カテゴリーは考慮しない * @param $category \Eccube\Entity\Category|integer|string * @return bool */ public function belongsToCategory($category) { if ($category instanceof \Eccube\Entity\Category) { $category = $category->getId(); } foreach ($this->ProductCategories as $C) { if (is_int($category)) { if ($C->getCategoryId() === $category) { return true; } } else if (is_string($category)) { if ($C->getCategory()->getName() === $category) { return true; // もし同じ名前のカテゴリーが複数登録されていればこの比較はできません } } else { // throw new \Exception()するなりお好きに } } return false; }
上記メソッドを追加したことにより、Twigテンプレート内やコントローラで簡単にカテゴリーのチェックを行うことができます。
例えば商品詳細ページでは以下のように書くことが可能になります。
app/template/default/Product/detail.twig
{% if Product.belongsToCategory(3) %} {{ Product.name }}はIDが3のカテゴリーに所属しています。 {% endif %}
{% if Product.belongsToCategory('食器') %} {{ Product.name }}は食器のカテゴリーに所属しています。 {% endif %}
カテゴリーIDは管理画面や商品一覧ページのURLで確認することができます。EC-CUBE3系4系をご利用の方はぜひお試しください。
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。