端くれプログラマの備忘録 Smarty [Smarty] モバイルデバイスからのアクセスを識別する

[Smarty] モバイルデバイスからのアクセスを識別する

バックエンドで識別処理を実装すればいいのだけど、事情によりSmartyテンプレート内で行いたい。

ユーザエージェントで識別するのが定石か。Smartyだと$_SERVER[‘HTTP_USER_AGENT’]を以下のように取得できる。識別処理を確実にするために全て小文字で取得しておく。

{$smarty.server.HTTP_USER_AGENT|lower}

ユーザエージェント文字列に、部分文字列として以下が含まれるか調べる。

  • Android
  • webOS
  • iPhone
  • iPad
  • iPod
  • BlackBerry
  • IEMobile
  • Opera Mini

部分文字列を調べるには以下を使う。もっと効率の良い方法があるかもしれない。

{if $str|regex_replace:'/foo/':'x' ne $str}
    fooが含まれていれば、TRUE
{/if}

参考: Smarty 文字列検索 | 私的雑録
http://php.o0o0.jp/article/smarty-regex

すると、判定処理は以下のように書ける。

{* 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} -->