前回、phalconのview(voltエンジン) vol2に引き続き、phalconのvoltエンジンに触れていきます。
Viewの統合
Viewの統合(他のviewの読み込み)には、partialを利用するものとincludeを利用するものがあります。一番の違いは、partialは実行時に毎回読み込まれます。includeはコンパイル時に読み込まれ、キャッシュファイルに展開されるので、読み込まれるファイルを頻繁に更新する場合はpartialがオススメです。また、partialはvolt以外で書かれたテンプレートも読み込めるが、includeはvoltテンプレートのみとなります。
- partial
//partials/footer.volt <p>footer partials</p> //volt <footer> {{ partial("partials/footer") }} </footer> //コンパイルされたphp <footer> <?php echo $this->partial('partials/footer'); ?> </footer> //出力されるhtml <footer> <p>footer partials</p> </footer>
- include
//partials/footer2.volt <p>footer include</p> //volt <footer> {% include "partials/footer2.volt" %} </footer> //コンパイルされたphp <footer> <p>footer include</p> </footer> //キャッシュファイルの段階で読み込まれ展開されています。 //出力されるhtml <footer> <p>footer include</p> </footer>
- テンプレートに引数渡して利用
//partials/footer.volt <p>footer partials<span>{{ footertext }}</span></p> //volt <footer> {{ partial("partials/footer", ['footertext': "テキスト変数"]) }} </footer> //コンパイルされたphp <footer> <?php echo $this->partial('partials/footer', array('footertext' => 'テキスト変数')); ?> </footer> //出力されるhtml <footer> <p>footer partials<span>テキスト変数</span></p> </footer>
Viewの継承
テンプレートのインターフェイスを作成し、そのファイルを拡張することで再利用性を高めることができます。
- extends
//volt //base.volt テンプレートインターフェイス <div> <h2>{% block h2_tag %}{% endblock %}</h2> <div> {% block content %}{% endblock %} </div> </div> //上記のようにblockタグを利用しbaseテンプレートを作成します。 //子volt {% extends "index/base.volt" %} {% block h2_tag %}タイトル{% endblock %} {% block content %}テキストテキストテキストテキスト{% endblock %} //actionは違うがレイアウトを同じにしたい場合に有用です。 //コンパイルされたphp <div> <h2>タイトル</h2> <div> テキストテキストテキストテキスト </div> </div> //出力されるhtml <div> <h2>タイトル</h2> <div> テキストテキストテキストテキスト </div> </div>
オリジナルのビルド関数やフィルターを追加する
- ビルド関数
$di->set('volt', function($view,$di){ $volt = new VoltEngine($view,$di); $volt->setOptions(array("compiledPath"=>APP_PATH."cache/volt/")); $compiler = $volt->getCompiler(); return $volt; },true);
内に記述します。
php関数をそのまま利用し、voltの関数として利用する場合は$compiler->addFunction('shuffle', 'str_shuffle');
とします。
独自処理を追加する場合は$compiler->addFunction( 'contains_text', function ($resolvedArgs, $exprArgs) { if (function_exists('mb_stripos')) { return 'mb_stripos(' . $resolvedArgs . ')'; } else { return 'stripos(' . $resolvedArgs . ')'; } } );
- フィルター
$di->set('volt', function($view,$di){ $volt = new VoltEngine($view,$di); $volt->setOptions(array("compiledPath"=>APP_PATH."cache/volt/")); $compiler = $volt->getCompiler(); return $volt; },true);
内に記述します。
php関数をそのまま利用し、フィルターとして利用する場合は$compiler->addFilter('hash', 'md5');
とします。
独自処理を追加する場合は$compiler->addFilter( 'int', function ($resolvedArgs, $exprArgs) { return 'intval(' . $resolvedArgs . ')'; } );