Symfoware

Symfowareについての考察blog

CodeIgniter 3でTwigテンプレートエンジンを使用する その2

CodeIgniter 3でTwigを使う方法を調べてみました。
CodeIgniter 3でTwigテンプレートエンジンを使用する

ここではControllerに処理を直接記載しましたが、
ライブラリ化したいと思うのが人情です。

探してみると、既に同じことを考えている方がいました。
Twig-Codeigniter

ただ、Twigの対応バージョンが古いようで、かつCodeIgniter 2向けの
ようでしたので、CodeIgniter 3 + Twig 1.18向けに修正してみました。

Twig-Codeigniter


インストール



まずは、ComposerでTwigを取得。
composer_autoloadをTRUEにしておきます。

CodeIgniter 3でTwigテンプレートエンジンを使用する


必要なファイルは、

application/config/twig.php
application/libraries/Twig.php


の2つです。

それぞれ、指定の場所に配置します。
また、デフォルトでapplication/cacheにテンプレートのキャッシュを作成します。
このディレクトリに書き込み権限を付与しておきます。




使い方



Controllerのサンプル


  1. <?php
  2. defined('BASEPATH') OR exit('No direct script access allowed');
  3. class Sample extends CI_Controller {
  4.     public function index() {
  5.         
  6.         $this->load->library('twig');
  7.         
  8.         $view_data = array('test_value' => '日本語でこんにちは');
  9.         $this->twig->view('twig.html', $view_data);
  10.         
  11.     }
  12. }




viewはデフォルトでapplication/viewに配置するようにしています。
application/view/twig.htmlはこんなかんじです。


  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5.     <title>Twigサンプル</title>
  6. </head>
  7. <body>
  8. <p>{{ test_value }}</p>
  9. </body>
  10. </html>




実行結果

618_01.png




関数の導入



viewで使用したい関数がある場合、1工夫必要です。
例えば、form_validatorヘルパーで定義されている
set_valueやform_errorを使用したい場合は、
register_functionで関数を登録します。


  1. <?php
  2. defined('BASEPATH') OR exit('No direct script access allowed');
  3. class Sample extends CI_Controller {
  4.     public function index() {
  5.         
  6.         $this->load->library('twig');
  7.         
  8.         // form_validator
  9.         $this->twig->register_function(new Twig_SimpleFunction('set_value', 'set_value'));
  10.         $this->twig->register_function(new Twig_SimpleFunction('form_error', 'form_error'));
  11.         
  12.         $view_data = array('test_value' => '日本語でこんにちは');
  13.         $this->twig->view('twig.html', $view_data);
  14.         
  15.     }
  16. }




これでテンプレート側でset_valueやform_errorが使用できるようになります。





独自関数の導入



テンプレートへの関数持ち込みをもう少し詳しく。

引数を取り、文字列を加工して出力する関数のサンプルです。


  1. <?php
  2. defined('BASEPATH') OR exit('No direct script access allowed');
  3. class Sample extends CI_Controller {
  4.     public function index() {
  5.         
  6.         $this->load->library('twig');
  7.         
  8.         // 独自関数導入
  9.         $this->twig->register_function(new Twig_SimpleFunction('hello', function($name) {
  10.             
  11.             return $name.'さん、こんにちは!';
  12.             
  13.         }));
  14.         
  15.         $view_data = array('user_name' => 'Symfoware');
  16.         $this->twig->view('twig.html', $view_data);
  17.         
  18.     }
  19. }




viewはこのようになります。


  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5.     <title>Twigサンプル</title>
  6. </head>
  7. <body>
  8. <p>{{ hello(user_name) }}</p>
  9. </body>
  10. </html>




実行結果

618_02.png



自動エスケープの停止



共通のcssやjsヘッダーを出力したい場合、テンプレートの
自動エスケープを停止したい場合があります。

具体的にはこのような感じ。


  1. <?php
  2. defined('BASEPATH') OR exit('No direct script access allowed');
  3. class Sample extends CI_Controller {
  4.     public function index() {
  5.         
  6.         $this->load->library('twig');
  7.         
  8.         // 独自関数導入
  9.         $this->twig->register_function(new Twig_SimpleFunction('hello', function($name) {
  10.             
  11.             return $name.'さん、<span style="color:red">こんにちは!<span>';
  12.             
  13.         }));
  14.         
  15.         $view_data = array('user_name' => 'Symfoware');
  16.         $this->twig->view('twig.html', $view_data);
  17.         
  18.     }
  19. }




HTMLタグが自動的にエスケープされます。

618_03.png


これを抑止するには、テンプレート側でrawを指定すればよいのですが、


  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5.     <title>Twigサンプル</title>
  6. </head>
  7. <body>
  8. <p>{{ hello(user_name)|raw }}</p>
  9. </body>
  10. </html>





デフォルトでエスケープを無視して欲しいところ。


http://twig.sensiolabs.org/doc/advanced.html
こちらの「Automatic Escaping」が参考になりました。
Twig_SimpleFunctionの第三引数で、エスケープの挙動を制御できます。


  1. <?php
  2. defined('BASEPATH') OR exit('No direct script access allowed');
  3. class Sample extends CI_Controller {
  4.     public function index() {
  5.         
  6.         $this->load->library('twig');
  7.         
  8.         // 独自関数導入
  9.         $this->twig->register_function(new Twig_SimpleFunction('hello', function($name) {
  10.             
  11.             return $name.'さん、<span style="color:red">こんにちは!<span>';
  12.             
  13.         }
  14.         ,array('is_safe' => array('html')) // エスケープ不要
  15.         ));
  16.         
  17.         $view_data = array('user_name' => 'Symfoware');
  18.         $this->twig->view('twig.html', $view_data);
  19.         
  20.     }
  21. }




これで「raw」を指定しなくても、そのまま出力されます。

618_04.png




【参考URL】

Twig-Codeigniter

Twigをもっと活用しよう :Symfony Advent Calender 2011 JP - 9日目 -

Extending Twig



関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/06/14(日) 17:30:23|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Visual Studio regionで閉じられたコードをデフォルトで展開状態にする | ホーム | Nginx + php-fpm + CodeIgniter3 のnginx.conf>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1727-80d9b432
この記事にトラックバックする(FC2ブログユーザー)