バックエンドで識別処理を実装すればいいのだけど、事情によりSmartyテンプレート内で行いたい。
ユーザエージェントで識別するのが定石か。Smartyだと$_SERVER[‘HTTP_USER_AGENT’]を以下のように取得できる。識別処理を確実にするために全て小文字で取得しておく。
1 |
{$smarty.server.HTTP_USER_AGENT|lower} |
ユーザエージェント文字列に、部分文字列として以下が含まれるか調べる。
- Android
- webOS
- iPhone
- iPad
- iPod
- BlackBerry
- IEMobile
- Opera Mini
部分文字列を調べるには以下を使う。もっと効率の良い方法があるかもしれない。
1 2 3 |
{if $str|regex_replace:'/foo/':'x' ne $str} fooが含まれていれば、TRUE {/if} |
参考: Smarty 文字列検索 | 私的雑録
http://php.o0o0.jp/article/smarty-regex
すると、判定処理は以下のように書ける。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
{* determine if mobile device *} {assign var="mobile" value=0} {assign var="user_agent" value=$smarty.server.HTTP_USER_AGENT|lower} {if $user_agent|regex_replace:'/android/':'x' ne $user_agent} {assign var="mobile" value=1} {/if} {if $user_agent|regex_replace:'/iphone/':'x' ne $user_agent} {assign var="mobile" value=1} {/if} {if $user_agent|regex_replace:'/webos/':'x' ne $user_agent} {assign var="mobile" value=1} {/if} {if $user_agent|regex_replace:'/ipad/':'x' ne $user_agent} {assign var="mobile" value=1} {/if} {if $user_agent|regex_replace:'/ipod/':'x' ne $user_agent} {assign var="mobile" value=1} {/if} {if $user_agent|regex_replace:'/blackberry/':'x' ne $user_agent} {assign var="mobile" value=1} {/if} {if $user_agent|regex_replace:'/iemobile/':'x' ne $user_agent} {assign var="mobile" value=1} {/if} {if $user_agent|regex_replace:'/opera mini/':'x' ne $user_agent} {assign var="mobile" value=1} {/if} <!-- mobile = {$mobile},{$user_agent} --> |