- 2018.06.26
- EC-cube
【EC-cube2.13】商品詳細ページで、所属カテゴリ毎に表示を変えたい

EC-cubeを運用されているクライアントに、「このカテゴリに所属している商品は別の表示ができないか」と相談されることがあります。
今回は、僕でもわかるとりあえず簡単そうな方法を1つご紹介します。
商品詳細ページではすでに、関連カテゴリとしてカテゴリ情報は保持していますので、触るのは下記テンプレートのみとなります。
data/Smarty/templates/default/products/detail.tpl
※プラグインを利用されている場合、修正すべきファイルが変更される場合があります。
第一階層(親)カテゴリで判別させたい場合
まずは、その商品が属するカテゴリの中で、第一階層のカテゴリで判別させたい場合です。
とりあえず複数のカテゴリは考慮せず、一番最初のカテゴリで判別させます。
<!--{if count($arrRelativeCat) > 0}-->
<!--{if $arrRelativeCat.0.0.category_id == 1}-->
第一階層のカテゴリIDが 1 の場合の内容(HTML)
<!--{elseif $arrRelativeCat.0.0.category_id == 2}-->
第一階層のカテゴリIDが 2 の場合の内容(HTML)
<!--{elseif $arrRelativeCat.0.0.category_id == 3}-->
第一階層のカテゴリIDが 3 の場合の内容(HTML)
<!--{/if}-->
<!--{/if}-->
$arrRelativeCat.0(一番最初のカテゴリの).0(第一階層カテゴリの).category_id(カテゴリIDが)○○の場合、って感じですね。
最下層(子)カテゴリで判別させたい場合
今度は、その商品が属するカテゴリの中で、最下層のカテゴリで判別させたい場合です。
これも複数のカテゴリは考慮せずに、一番最初のカテゴリで判別させます。
この場合カテゴリの設定次第で、最下層の位置(深さ?)が異なりますので、配列数を @count で求める必要があります。
<!--{if count($arrRelativeCat) > 0}-->
<!--{assign var="num" value=$arrRelativeCat[0]|@count}-->
<!--{assign var="num2" value=`$num-1`}-->
<!--{if $arrRelativeCat.0.$num2.category_id == 4}-->
最下層のカテゴリIDが 4 の場合の内容(HTML)
<!--{elseif $arrRelativeCat.0.$num2.category_id == 5}-->
最下層のカテゴリIDが 5 の場合の内容(HTML)
<!--{elseif $arrRelativeCat.0.$num2.category_id == 6}-->
最下層のカテゴリIDが 6 の場合の内容(HTML)
<!--{/if}-->
<!--{/if}-->
assign var="num(numは)" value=$arrRelativeCat[0](最初のカテゴリの)|@count(配列の数、つまり深さだよ)
assign var="num2" value=`$num-1`(でも0から始まっちゃうから-1しとくね)って感じですかね。
第一階層(親)カテゴリで判別させたい場合(複数カテゴリ)
さらに、複数カテゴリにも対応させつつ第一階層のカテゴリで判別させたい場合です。
<!--{if count($arrRelativeCat) > 0}-->
<!--{section name=cnt loop=$arrRelativeCat}-->
<!--{if $arrRelativeCat[cnt].0.category_id == 1}-->
第一階層のカテゴリIDが 1 の場合の内容(HTML)
<!--{/if}-->
<!--{if $arrRelativeCat[cnt].0.category_id == 2}-->
第一階層のカテゴリIDが 2 の場合の内容(HTML)
<!--{/if}-->
<!--{if $arrRelativeCat[cnt].0.category_id == 3}-->
第一階層のカテゴリIDが 3 の場合の内容(HTML)
<!--{/if}-->
<!--{/section}-->
<!--{/if}-->
複数カテゴリになったため、
section name=cnt(cntという変数で) loop=$arrRelativeCat($arrRelativeCatをループをまわすよ)
$arrRelativeCat[cnt](ループしている複数カテゴリのcnt個目の).0(第一階層カテゴリの).category_id(カテゴリIDが)○○の場合、って感じですね。
最下層(子)カテゴリで判別させたい場合(複数カテゴリ)
最後に、複数カテゴリにも対応させつつ最下層のカテゴリで判別させたい場合です。
<!--{if count($arrRelativeCat) > 0}-->
<!--{section name=cnt loop=$arrRelativeCat}-->
<!--{assign var="num" value=$arrRelativeCat[cnt]|@count}-->
<!--{assign var="num2" value=`$num-1`}-->
<!--{if $arrRelativeCat[cnt].$num2.category_id == 1}-->
最下層のカテゴリIDが 1 の場合の内容(HTML)
<!--{/if}-->
<!--{if $arrRelativeCat[cnt].$num2.category_id == 2}-->
最下層のカテゴリIDが 2 の場合の内容(HTML)
<!--{/if}-->
<!--{if $arrRelativeCat[cnt].$num2.category_id == 3}-->
最下層のカテゴリIDが 3 の場合の内容(HTML)
<!--{/if}-->
<!--{/section}-->
<!--{/if}-->
基本的には2個目と3個目の合わせ技ですね!
ループ内で所属カテゴリそれぞれの最下層カテゴリの深さを求めています。
上記だと対応できないケースも
これまで紹介してきた方法だと対応できない場合もありますので、随時更新していけたらと思います。