Phalcon

PhalconのテンプレートエンジンVolt(1)

更新日:

今日は、PhalconのテンプレートエンジンのVoltについて調べてみたいと思います。以下は、Google先生のお力をお借りしながら訳していますが、間違っている可能性がありますので、疑問に感じた部分は公式サイトを確認してください。。

Voltは、PHPのためのC言語で書かれた超高速、デザイナーに扱いやすいテンプレート言語です。Voltは簡単な方法でビューを書けるようにあなたにヘルパーのセットを提供します。ボルトは非常にあなたのアプリケーションで、ファルコンの他のコンポーネントと統合されているアプリケーションと同じように、スタンドアロンコンポーネントとして使用することができます。

Voltは、Armin Ronacher氏によって作成されたJinjaに影響を受けています。そのため、同じようなテンプレートエンジンを使用していた多くの開発者は、同じ構文を使用するおなじみの開発環境になります。より多くの要素で、そして、もちろんPhalconの作業中に、開発者が慣れてきたパフォーマンスで、Voltの構文と機能は強化されています。

はじめに

Voltビューは、下記のように、基本的には、手動でのPHPコードを書く手間を省く、純粋なPHPコードにコンパイルされています。

{# app/views/products/show.volt #}
{% block last_products %}
{% for product in products %}
 * Name: {{ product.name|e }}
 {% if product.status == "Active" %}
 Price: {{ product.price + product.taxes/100 }}
 {% endif %}
 {% endfor %}
{% endblock %}

Voltの有効化

他のテンプレートエンジンとして、新しい拡張機能を使用して、ビューコンポーネントにVoltを登録するか、スタンダートな.phtmlを再利用する場合があります。

<?php
//テンプレートエンジンとしてVoltを登録
 $di->set('view', function() {
$view = new \Phalcon\Mvc\View();
$view->setViewsDir('../app/views/');
$view->registerEngines(array(
 ".volt" => 'Phalcon\Mvc\View\Engine\Volt'
 ));
return $view;
 });
または、下記のように標準の「.phtml」の拡張子を使用します。
<?php
$view->registerEngines(array(
 ".phtml" => 'Phalcon\Mvc\View\Engine\Volt'
 ));

基本的な使い方

ビューは、VoltのコードとPHPとHTMLで構成されています。特別な区切り文字の集合で、ボルト·モードに入ることができます。値を割り当てるために使用される{%...%}で、forループなどのステートメントを実行するか、{{...}}では、テンプレートに式の結果を出力します。

以下に、いくつかの基本を示す最小限のテンプレートを表記します。

{# app/views/posts/show.phtml #}
 <!DOCTYPE html>
 <html>
 <head>
 <title>{{ title }} - An example blog</title>
 </head>
 <body>
{% if show_navigation %}
 <ul id="navigation">
 {% for item in menu %}
 <li><a href="{{ item.href }}">{{ item.caption }}</a></li>
 {% endfor %}
 </ul>
 {% endif %}
<h1>{{ post.title }}</h1>
<div class="content">
 {{ post.content }}
 </div>
</body>
 </html>

Phalcon\Mvc\Viewを使用して、コントローラからビューへ変数を渡すことができます。上記の例では、3つの変数(title、menu、post)がビューに渡されました

<?php
class PostsController extends \Phalcon\Mvc\Controller
 {
public function showAction()
 {
$post = Post::findFirst();
$this->view->title = $post->title;
 $this->view->post = $post;
 $this->view->menu = Menu::find();
 $this->view->show_navigation = true;
}
}

変数

オブジェクト変数は、構文を使用してアクセスできる属性を持っていることがあります。あなたは配列を渡す場合は、foo ['bar']のように、角括弧構文を使用する必要があります。

{{ post.title }} {# for $post->title #}
 {{ post['title'] }} {# for $post['title'] #}

フィルタ

変数は、フィルタを使用して、フォーマットしたり、変更することができる。パイプ演算子| は変数にフィルタを適用するために使用されます。

{{ post.title|e }}
 {{ post.content|striptags }}
 {{ name|capitalize|trim }}

下記に、ボルトで利用できる組み込みフィルタのリストを表記します。

  • e
    Phalcon\Escaper->escapeHtml の値を返します。
  • escape
    Phalcon\Escaper->escapeHtml の値を返します。
  • escape_css
    Phalcon\Escaper->escapeCss の値を返します。
  • escape_js
    Phalcon\Escaper->escapeJs の値を返します。
  • escape_attr
    Phalcon\Escaper->escapeHtmlAttr の値を返します。
  • trim
    php関数の、trimを適用した値を返します。文字列の前後のスペースを削除します。
  • left_trim
    php関数の、ltrimを適用した値を返します。文字列の最初のスペースを削除します。
  • right_trim
    php関数の、rtrimを適用した値を返します。文字列の最後のスペースを削除します。
  • striptags
    php関数の、strip_tagsを適用した値を返します。
  • slashes
  • stripslashes
    php関数の、stripslashesを適用した値を返します。クォートされた文字列のクォート部分を削除します。
  • capitalize
    php関数のucwordsを適用します。文字列の各単語の最初の文字を大文字にします。
  • lower
    文字列を小文字に変換します。
  • upper
    文字列を大文字に変換します。
  • length
    文字列の長さをカウントします。
  • nl2br
    php関数のnl2brを適用した値を返します。
  • sort
    php関数のasortを適用した値を返します。
  • keys
    php関数のarray_keysを適用した値を返します。
  • join
    php関数のimplodeを適用した値を返します。
  • format
    php関数のsprintfを適用した値を返します。
  • json_encode
    php関数のjson_encodeを適用した値を返します。
  • json_decode
    php関数のjson_decodeを適用した値を返します。
  • abs
    php関数のabsを適用した値を返します。
  • url_encode
    php関数のurlencodeを適用した値を返します。
  • default
    評価値がnullの場合のデフォルト値を設定します。
  • convert_encoding
    別の文字コードにエンコードします。

使用例

{# e or escape filter #}
 {{ "<h1>Hello<h1>"|e }}
 {{ "<h1>Hello<h1>"|escape }}
{# trim filter #}
 {{ " hello "|trim }}
{# striptags filter #}
 {{ "<h1>Hello<h1>"|striptags }}
{# slashes filter #}
 {{ "'this is a string'"|slashes }}
{# stripslashes filter #}
 {{ "\'this is a string\'"|stripslashes }}
{# capitalize filter #}
 {{ "hello"|capitalize }}
{# lower filter #}
 {{ "HELLO"|lower }}
{# upper filter #}
 {{ "hello"|upper }}
{# length filter #}
 {{ "robots"|length }}
 {{ [1, 2, 3]|length }}
{# nl2br filter #}
 {{ "some\ntext"|nl2br }}
{# sort filter #}
 {% set sorted=[3, 1, 2]|sort %}
{# keys filter #}
 {% set keys=['first': 1, 'second': 2, 'third': 3]|keys %}
{# json_encode filter #}
 {% robots|json_encode %}
{# json_decode filter #}
 {% set decoded='{"one":1,"two":2,"three":3}'|json_decode %}
{# url_encode filter #}
 {{ post.permanent_link|url_encode }}
{# convert_encoding filter #}
 {{ "désolé"|convert_encoding('utf8', 'latin1') }}

コメント

コメントは、{#...#}のように、#デリミタを使用してテンプレートに追加することができます。その中のすべてのテキストは、最終出力では無視されます。

制御構文の一覧

Voltは、テンプレートで使用するための基本的だが強​​力な制御構造のセットを提供します

For

シーケンス内の各項目をループします。次の例では、「robots」のデータセットを横断(循環)し、彼(又は、彼女)の名前を出力する方法を示します。

<h1>Robots</h1>
 <ul>
 {% for robot in robots %}
 <li>{{ robot.name|e }}</li>
 {% endfor %}
 </ul>

forループ内でもネストすることができます:

<h1>Robots</h1>
 {% for robot in robots %}
 {% for part in robot.parts %}
 Robot: {{ robot.name|e }} Part: {{ part.name|e }} <br/>
 {% endfor %}
 {% endfor %}

あなたは、次のような構文を使用してPHPの対応のように要素 "キー"を取得することができます:

{% set numbers = ['one': 1, 'two': 2, 'three': 3] %}
{% for name, value in numbers %}
 Name: {{ name }} Value: {{ value }}
 {% endfor %}

“if” 構文の評価は、任意に設定することがでます。

{% set numbers = ['one': 1, 'two': 2, 'three': 3] %}
{% for value in numbers if value < 2 %}
 Value: {{ value }}
 {% endfor %}
{% for name, value in numbers if name != 'two' %}
 Name: {{ name }} Value: {{ value }}
 {% endfor %}

"else"構文は、"if"構文の'内部で定義されている場合、"if"構文の反復がゼロの場合、イテレータの結果で表現した場合に実行されます。

<h1>Robots</h1>
 {% for robot in robots %}
 Robot: {{ robot.name|e }} Part: {{ part.name|e }} <br/>
 {% else %}
 There are no robots to show
 {% endfor %}

代替構文:

<h1>Robots</h1>
 {% for robot in robots %}
 Robot: {{ robot.name|e }} Part: {{ part.name|e }} <br/>
 {% elsefor %}
 There are no robots to show
 {% endfor %}

ループの制御

「break」と「continue」構文は、現在のブロックのループを強制的に終了したり、継続したりすることができます。

{# skip the even robots #}
 {% for index, robot in robots %}
 {% if index is even %}
 {% continue %}
 {% endif %}
 ...
 {% endfor %}
 {# exit the foreach on the first even robot #}
 {% for index, robot in robots %}
 {% if index is even %}
 {% break %}
 {% endif %}
 ...
 {% endfor %}

PHPの「if」構文は、式が真または偽として評価を表します。

<h1>Cyborg Robots</h1>
 <ul>
 {% for robot in robots %}
 {% if robot.type == "cyborg" %}
 <li>{{ robot.name|e }}</li>
 {% endif %}
 {% endfor %}
 </ul>

else節もサポートされています:

<h1>Robots</h1>
 <ul>
 {% for robot in robots %}
 {% if robot.type == "cyborg" %}
 <li>{{ robot.name|e }}</li>
 {% else %}
 <li>{{ robot.name|e }} (not a cyborg)</li>
 {% endif %}
 {% endfor %}
 </ul>

「elseif」制御フロー構造は、「switch」ブロックをエミュレートする場合は、一緒に使用することができます:

{% if robot.type == "cyborg" %}
 Robot is a cyborg
 {% elseif robot.type == "virtual" %}
 Robot is virtual
 {% elseif robot.type == "mechanical" %}
 Robot is mechanical
 {% endif %}

ループ・コンテキスト

ループは、あなたについての情報を提供するのための「for」ループのような、特殊変数は、内部利用可能です。

  • loop.index
  • loop.index0
  • loop.revindex
  • loop.revindex0
  • loop.first
  • loop.last
  • loop.length
{% for robot in robots %}
 {% if loop.first %}
 <table>
 <tr>
 <th>#</th>
 <th>Id</th>
 <th>Name</th>
 </tr>
 {% endif %}
 <tr>
 <td>{{ loop.index }}</td>
 <td>{{ robot.id }}</td>
 <td>{{ robot.name }}</td>
 </tr>
 {% if loop.last %}
 </table>
 {% endif %}
 {% endfor %}

変数の割り当て

{% for robot in robots %}
 {% if loop.first %}
 <table>
 <tr>
 <th>#</th>
 <th>Id</th>
 <th>Name</th>
 </tr>
 {% endif %}
 <tr>
 <td>{{ loop.index }}</td>
 <td>{{ robot.id }}</td>
 <td>{{ robot.name }}</td>
 </tr>
 {% if loop.last %}
 </table>
 {% endif %}
 {% endfor %}

変数の割り当て

変数は、"set"命令を使用してテンプレート内で変更することができます。

{% set fruits = ['Apple', 'Banana', 'Orange'] %}
{% set name = robot.name %}

複数の割り当ては同じ命令構文内で許可されています。

{% set fruits = ['Apple', 'Banana', 'Orange'], name = robot.name, active = true %}

さらに、複合代入演算子を使用することができます。

{% set price += 100.00 %}
{% set age *= 5 %}

次の演算子が用意されています。

  • =
  • +=
  • -=
  • *=
  • /=

Volatはリテラルと共通の演算子など表現のサポートの基本セットを提供します。

式を評価して、 '{{'と '}}'区切り文字を使用して出力することができます:

{{ (1 + 1) * 2 }}

もし、(計算結果等を)出力することなく、評価する必要がある場合、下記のような"do"ステートメントを使用することができます。

{% do (1 + 1) * 2 %}

リテラル

以下のリテラルがサポートされています。

  • “this is a string”
  • 100.25
  • 100
  • false
  • true
  • null

 配列

あなたがPHP 5.3、5.4または5.5を使用している場合、あなたは角括弧[ ]内に値のリストを記述することで配列を作成することができます。

{# Simple array #}
{{ ['Apple', 'Banana', 'Orange'] }}
{# Other simple array #}
{{ ['Apple', 1, 2.5, false, null] }}
{# Multi-Dimensional array #}
{{ [[1, 2], [3, 4], [5, 6]] }}
{# Hash-style array #}
{{ ['first': 1, 'second': 4/2, 'third': '3'] }}

中括弧{ }は、配列やハッシュを定義するために使用することができます:

{% set myArray = {'Apple', 'Banana', 'Orange'} %}
{% set myHash = {'first': 1, 'second': 4/2, 'third': '3'} %}

演算子

あなたは、次の演算子を使用して、テンプレート内の計算を行う場合があります。

  • +
  • -
  • *
  • /
  • %

比較演算子

以下のような比較演算子が用意されています。

  • ==
  • !=
  • <>
  • >
  • <
  • <=
  • >=
  • ===
  • !==

論理演算子

論理演算子は、複数のテストを結合する "if" 式の評価に有用である:

  • or
  • and
  • not
  • ( expr )

その他の演算子

下記のような、追加の演算子が用意されています。

  • ~
  • |
  • ..
  • is
  • in
  • is not
  • ‘a’ ? ‘b’ : ‘c’
  • ++
  • --
{% set robots = ['Voltron', 'Astro Boy', 'Terminator', 'C3PO'] %}
{% for index in 0..robots|length %}
 {% if robots[index] is defined %}
 {{ "Name: " ~ robots[index] }}
 {% endif %}
{% endfor %}

本日は、以上です。

本日のまとめ

  1. Voltは、C言語で書かれた高速なテンプレート言語である。
  2. Voltは、Phalcon\MvcViewのregisterEnginesメソッドで、セットして、DIコンテナに登録する。
  3. Voltは、標準の.phtml拡張子で、セットすることもできる。
  4. For文などのステートメントを使用するには、{%...%}を使用する。
  5. テンプレートに結果を出力するには、{{...}}を使用する。
  6. コントローラから、Phalcon\Mvc\Viewコンポーネントを使用して、ビューへ変数を渡すことができる。
    • $post=Post::findFirst();
      $this->view->title=$post->title;
      $this->view->post=$post;
      $this->view->menu=Menu::find();
      $this->view->show_navigation=true;
  7. オブジェクト変数は、. (ドット)でアクセスすることができる。 {{ post.title }}
  8. 配列には、角括弧[ ]を使用してアクセスする。 {{ post['title'] }}
  9. パイプ演算子を使って、フィルターを適用することができる。 {{ post.content | striptags }}
  10. パイプ演算子は、同時に複数適用することができる。 {{name | aptitalize | trim }}
  11. コメントは、 {{#...#}}で記述する。
  12. For制御構文の例
    1. {% for robot in robots %}...{% endfor %}
      <?php foreach($robots as $robot):?>...<?php endforeach;?>と同じかな?
  13. "break"や"continue"ステートメントで、ループを制御することができる。
  14. "if"文や"else"、"elseif"も使用することができる。
  15. テンプレートの"set"構文で変数に値を割り当てることができる。
  16. {% ... %}内で、式、リテラル、配列、比較演算子や論理演算子などを使用することができる。

-Phalcon

Copyright© WinRoad徒然草 , 2018 All Rights Reserved Powered by AFFINGER5.