Symfony2で簡単に表示を切り替える方法を探したがマッチするのがみつからなかった。。
すべてのページに対して、スマートフォンとPCで表示を切り替えたい。
といっても、全体構成を、スマートフォンでは1カラム、PCでは2カラムにしたいだけ。
なので、全体構成を記載した、ベースのTwigテンプレート内でスマートフォンなのか
PCなのかを判別してその中だけで完結したい。
コントローラで判別すると、すべてのアクションでその判別結果を渡すか、テンプレート
を変えなくてはならないためめんどくさいからです。
しかし、Twigテンプレート内では、User-Agent情報は取得できるが、判断する関数が
なかった。
なので、Twig Extensionっていう自分でtwigの関数やタグ、フィルターを作れる
機能を用いて判別関数を実装することにした。
DemoBundleにはTwigExtensionの実例があるので参考になります。
そのほか以下のページなども参考になります。
http://symfony.com/doc/2.0/cookbook/templating/twig_extension.html
とりあえず以下のことをします。
1. Twig/Extension 配下に以下の内容で “SmartPhoneExtension.php” を作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
new \Twig_Function_method($this, 'isSp') ); } public function isSp($ua) { if((strpos($ua, 'iPhone') !== false) || (strpos($ua, 'iPod') !== false) || (strpos($ua, 'Android') !== false)){ return true; } //return $ua; return false; } public function getName() { return "smart_phone"; } } |
2. “Resources/config/services.yml” のservicesに以下を追加
1 2 3 4 |
links.twig.isSp: class: My\LinksBundle\Twig\Extension\SmartPhoneExtension tags: - { name: twig.extension } |
3.
1 2 3 4 5 |
{% if isSp(app.request.headers.get('User-Agent')) %} // ・・・ {% else %} // ・・・ {% endif %} |