ColorMe!ShopProのテンプレート構築で欠かせないif文とかについての解説。
if文というのは英語の意味と同じで「もし~ならば」という動作をする。
処理に説明をつけると次のようになります。
[smarty]
<{if (条件)}>//もし(条件)ならば~
(条件に該当する場合の処理)を実行
<{else}>//あてはまらなければ~
(条件に該当しない場合の処理)を実行
<{/if}>
[/smarty]
ifの間にはelseifを加えて複数条件を分岐させることが出来ます。
[smarty]
<{if (条件)}>//もし(条件)ならば~
(条件に該当する場合の処理)を実行
<{elseif (条件2)}>//もし(条件2)ならば~
(条件2に該当する場合の処理)を実行
<{else}>//あてはまらなければ~
(いずれにも該当しない場合の処理)を実行
<{/if}>
[/smarty]
上から条件と照らし合わせて比較していき、該当したら処理を実行してifから抜けます。
elseは省略してもエラーになりません。
ifの中にifを入れる事も出来ます。
入れ子に出来る数の上限はないものの、あんまり複雑にすると重くなるしエラーも出やすくなるのでほどほどに。
演算子について
ifに使う条件は演算子で書きますが、PHPで使用できるものはそのまま使えます。
右側が比較する側、左側が比較される側です。
文字の場合はダブルクォートで囲み、数値の場合はそのまま記述する。
A == B
(等しい)
AとBが完全一致するかどうか比較します。代替はeq。
例:もしフリーページエリアの使用フラグがtrueならば(1ページでもフリーページがあればtrue)
[smarty]<{if $free_area_flg == true}>[/smarty]
A != B
(等しくない)
AとBが一致しないかどうか比較します。代替はneまたはneq。
例:もしおすすめ商品個数が0でないなら
[smarty]<{if $recommend_num != 0}>[/smarty]
A > B
(より大きい)
A >= B
(より大きいか等しい)
AがBより大きいかどうか比較します。イコールをつけると等しい場合も該当する。
代替はgt。イコールが付く場合はgeまたはgte。
例:もしカテゴリIDが3より大きければ(セクション内で使用)
[smarty]<{if $category[num].id > 3}>[/smarty]
A < B
(より小さい)
A <= B
(より小さいか等しい)
AがBより小さいかどうか比較します。イコールをつけると等しい場合も該当する。
代替はlt。イコールが付く場合はleまたはlte。
例:もしサブカテゴリー数が3より小さければ
[smarty]<{if $subcategory_num < 3}>[/smarty]
! A
(否定)
Aじゃなければ、という意味です。
! A == B
というように式と組み合わせることも出来ます。
代替はnot。
A % B
(余剰)
AをBで割って比較します。代替はmod。
例:もしトラックバック数が2で割って余りが0なら
[smarty]<{ if $trackback_num % 2 ==0 }>[/smarty]
条件はいくつか繋げることが出来、論理演算子と呼ばれます。
主に次のようなものがあります。
A and B
A && B
(かつ)
AとB(の式)を比較してどちらも該当する場合にtrue。
A or B
A || B
(または)
AとB(の式)を比較してどちらかに該当すればtrue。
A xor B
どちらかには該当するけど両方には該当しない場合にtrue。
余剰の式は、3列ごとに改行入れるようなカラム操作で使われます。
テンプレート「ビューティ」のサブカテゴリ表示ソースを参考にすると
[smarty]
<{if $subcategory_num != 0}>
<{section name=num loop=$sub_category}> |
<{/if}>
[/smarty]
セクションの中に入ってるifで条件に該当すれば改行する処理をしています。
▼この部分
[smarty]<{if $smarty.section.num.iteration % 4 == 0 and $smarty.section.num.last == false}>[/smarty]
$smartyという予約変数は、環境変数やリクエスト変数に直接アクセスできるようになるものです。
$smarty.section.num.iteration
という書き方では、numという名前のセクションループの反復された回数が入った変数、という感じ。
若干ややこしいですが次のような意味です。
$smarty.section.num.iteration % 4 == 0
numという名前のセクションループの反復された回数が、4で割って余らない場合
and
かつ
$smarty.section.num.last == false
最後の処理でなければ
この場合、4で割って余りが出なければという指示なので、横に4つ並べる処理になります。
3列や2列にしたい場合は$smarty.section.num.iteration % 4
を3や2など、並べたい数に変更する。