phalconのview(voltエンジン) vol2


前回、phalconのview(voltエンジン)に引き続き、phalconのvoltエンジンに触れていきます。

voltのビルトイン変数

defined
変数が定義されているかどうかをチェックし、定義されていればtrueを返す。

{% if a is defined %}

は、phpにコンパイルすると

<?php if (isset($a)) { ?>

となります。

empty
変数がempty(空)の場合、trueを返す(※)

{% if a is empty %}

は、phpにコンパイルすると

<?php if (empty($a)) { ?>

となります。

even
変数が数字の偶数かどうかをチェックします。偶数ならtrueを返します

{% set a = 2 %}
{% if a is even %}

は、phpにコンパイルすると

<?php $a = 2; ?>
<?php if (((($a) % 2) == 0)) { ?>
odd
変数が数字の奇数かどうかをチェックします。奇数ならtrueを返します

{% set a = 1 %}
{% if a is odd %}

は、phpにコンパイルすると

<?php $a = 1; ?>
<?php if (((($a) % 2) != 0)) { ?>
numeric
変数が数字かどうかをチェックします。数字ならtrueを返します

{% set a = 1 %}
{% if a is numeric %}

は、phpにコンパイルすると

<?php $a = 1; ?>
<?php if (is_numeric($a)) { ?>
scalar
変数がスカラー(配列やオブジェクト以外)かどうかをチェックします。スカラーならtrue、配列やオブジェクトならfalseを返します

{% set a = "aaa" %}
{% if a is scalar %}
true
{% else %}
false
{% endif %}

は、trueをかえします。またphpにコンパイルすると

<?php $a = 'aaa'; ?>
<?php if (is_scalar($a)) { ?>
true
<?php } else { ?>
false
<?php } ?>

しかし、

{% set a = ["aaa","bbb"] %}
{% if a is scalar %}
true
{% else %}
false
{% endif %}

は、falseをかえします。またphpにコンパイルすると

<?php $a = array('aaa', 'bbb'); ?>
<?php if (is_scalar($a)) { ?>
true
<?php } else { ?>
false
<?php } ?>

となります

iterable
イテレータかどうかをチェックします。phalconの「forループ」はphpの「foreachループ」になります。このループを使用することができる変数かどうかのチェックになります。

{% set a = ["aaa","bbb"] %}
{% if a is iterable %}
{% for b in a %}

{% endfor %}
{% else %}
false
{% endif %}

は、trueをかえしループ処理を行えます。またphpにコンパイルすると

<?php $a = array('aaa', 'bbb'); ?>
<?php if ((is_array($a) || ($a) instanceof Traversable)) { ?>
<?php foreach ($a as $b) { ?>

<?php } ?>
<?php } else { ?>
false
<?php } ?>

ここに出現する「Traversable」は foreach を使用してたどれるかどうかを検出するインターフェイスです。詳しくは、Traversable インターフェイスをご確認ください。

divisibleby
指定した数字で割り切れるかどうかをチェックします。割り切れればtrueを返します。下のphpとの比較をご覧ください。

{% set a = 2 %}
{% if a is divisibleby(2) %}
true
{% else %}
false
{% endif %}

またphpにコンパイルすると

<?php $a = 2; ?>
<?php if (((($a) % (2)) == 0)) { ?>
true
<?php } else { ?>
false
<?php } ?>
sameas
変数がもうひとつの変数と同じかどうか(型のチェック含む)をチェックします。

{% set a = "test" %}
{% if a is sameas("test") %}
true
{% else %}
false
{% endif %}

またphpにコンパイルすると

<?php $a = 'test'; ?>
<?php if (($a) === ('test')) { ?>
true
<?php } else { ?>
false
<?php } ?>

上記のように型までチェックするので

{% set a = 2 %}
{% if a is sameas(2) %}

はtrueを返しますが、一方

{% set a = 2 %}
{% if a is sameas('2') %}

これはfalseになります。

type
変数が指定された型かどうかをチェックします

{% set a = false %}
{% if a is type('boolean') %}
true
{% else %}
false
{% endif %}

またphpにコンパイルすると

<?php $a = false; ?>
<?php if (gettype($a) === ('boolean')) { ?>
true
<?php } else { ?>
false
<?php } ?>

個人的には、phpのis_boolのようなis_*を利用するほうがきれいかなと思います。

※)参考になります。不安な方は一度読んでみてください。phpの型の比較表

マクロ(macro)って

マクロはphpでいうfunctionのようなものです。テンプレート内の共通処理をまとめることができます。しかし、複数のテンプレートにまたがった共通処理は、includeなどを使うことをお勧めします。マクロの使い方

関数意義

{%- macro マクロ名(引数) %}
    処理
{%- endmacro %}

呼び出し方

{{ マクロ名(引数) }}

例1)

{%- macro out_text(text) %}
    <p>
    {{ text }}
    </p>
{%- endmacro %}

{{ out_text("1回目") }}

<div>This is the content</div>

{{ out_text("2回目") }}

は、以下のように出力されます。

1回目

This is the content
2回目

コンパイルされたphpは

<?php $this->_macros['out_text'] = function($__p = null) { if (isset($__p[0])) { $text = $__p[0]; } else { if (isset($__p["text"])) { $text = $__p["text"]; } else {  throw new \Phalcon\Mvc\View\Exception("Macro 'out_text' was called without parameter: text");  } }  ?>
    <p>
    <?php echo $text; ?>
    </p><?php }; $this->_macros['out_text'] = \Closure::bind($this->_macros['out_text'], $this); ?>


<?php echo $this->callMacro('out_text', array('1回目')); ?>

<div>This is the content</div>


<?php echo $this->callMacro('out_text', array('2回目')); ?>

となります。また、マクロは返り値(return)を設定することができます。

{%- macro my_input(name, class) %}
    {% return text_field(name, 'class': class) %}
{%- endmacro %}

{{ '<p>' ~ my_input('name', 'input-text') ~ '</p>' }}

上記のように、macro内で{% return **** %}と記述します。

タグヘルパー

voltでは、htmlの記述量を減らしてくれるヘルパーがデフォルトでいくつか用意されております。詳細はPhalcon\Tag

link_to
aタグを生成する。タグの定義

linkTo (string $parameters, [string $text], [boolean $local])

$parameters:uri
$text:表示するテキスト
$local:trueの場合、アプリケーションの$url->setBaseUri(‘uri’);で設定したBaseUriが先頭に着きます。falseの場合、$parameters(http://****)が出力されます。
内部リンクの場合

//volt
{{linkTo("signup/register", "Register Here!")}}

//コンパイルされたphp
<?php echo $this->tag->linkto('signup/register', 'Register Here!'); ?>

//出力されたhtmlコード
<a href="/invo/signup/register">Register Here!</a>

外部リンクの場合

//volt
{{linkTo("https://phalconphp.com/ja/", "phalcon",false)}}

//コンパイルされたphp
<?php echo $this->tag->linkto('https://phalconphp.com/ja/', 'phalcon', false); ?>

//出力されたhtmlコード
<a href="https://phalconphp.com/ja/">phalcon</a>

タグにclassなどの属性を追加する

//volt
{{linkTo(["https://phalconphp.com/ja/", "phalcon","local":false,"class":"btn","target":"_blank","title":"phalcon"])}}

//コンパイルされたphp
<?php echo $this->tag->linkto(array('https://phalconphp.com/ja/', 'phalcon', 'local' => false, 'class' => 'btn', 'target' => '_blank', 'title' => 'phalcon')); ?>

//出力されたhtmlコード
<a href="https://phalconphp.com/ja/" class="btn" target="_blank" title="phalcon">phalcon</a>

属性の追加するときは、配列で渡します。

text_field
テキストタイプのinputタグを生成する。タグの定義は

textField(パラメータ)

例は

//ノーマル
//volt
{{textField("name")}}

//コンパイルされたphp
<?php echo $this->tag->textfield('name'); ?>

//出力されたhtmlコード
<input type="text" id="name" name="name">


//属性を色々指定してみる。
//volt
{{textField("name":"name","id":"id_name","placeholder":"入力してください")}}

//コンパイルされたphp
<?php echo $this->tag->textfield(array('name' => 'name', 'id' => 'id_name', 'placeholder' => '入力してください')); ?>

//出力されたhtmlコード
<input type="text" id="id_name" name="name" placeholder="入力してください">
password_field
パスワードタイプのinputタグを生成する。タグの定義は

password_field(パラメータ)

例は

//ノーマル
//volt
{{password_field("password")}}

//コンパイルされたphp
<?php echo $this->tag->passwordField(array('password')); ?>

//出力されたhtmlコード
<input type="password" id="password" name="password">


//属性を色々指定してみる。
//volt
{{password_field("name":"password","id":"id_name","placeholder":"8文字以上")}}

//コンパイルされたphp
<?php echo $this->tag->passwordField(array('name' => 'password', 'id' => 'id_name', 'placeholder' => '8文字以上')); ?>

//出力されたhtmlコード
<input type="password" id="id_name" name="password" placeholder="8文字以上">
hidden_field
hiddenタイプのinputタグを生成する。タグの定義は

hidden_field(パラメータ)

例は

//ノーマル
//volt
{{hidden_field("hidden_1")}}

//コンパイルされたphp
<?php echo $this->tag->hiddenField(array('hidden_1')); ?>

//出力されたhtmlコード
<input type="hidden" id="hidden_1" name="hidden_1">


//属性を色々指定してみる。
//volt
{{hidden_field("name":"hidden_1","id":"id_hidden_1")}}

//コンパイルされたphp
<?php echo $this->tag->hiddenField(array('name' => 'hidden_1', 'id' => 'id_hidden_1')); ?>

//出力されたhtmlコード
<input type="hidden" id="id_hidden_1" name="hidden_1">
file_field
fileタイプのinputタグを生成する。タグの定義は

file_field(パラメータ)

例は

//ノーマル
//volt
{{file_field("file_1")}}

//コンパイルされたphp
<?php echo $this->tag->fileField(array('file_1')); ?>

//出力されたhtmlコード
<input type="file" id="file_1" name="file_1">


//属性を色々指定してみる。
//volt
{{file_field("name":"file_1","id":"id_file_1")}}

//コンパイルされたphp
<?php echo $this->tag->fileField(array('name' => 'file_1', 'id' => 'id_file_1')); ?>

//出力されたhtmlコード
<input type="file" id="id_file_1" name="file_1">
check_field
check boxタイプのinputタグを生成する。タグの定義は

check_field(パラメータ)

例は

//volt
{{check_field("check_1","value":"Y")}}checkbox test

//コンパイルされたphp
<?php echo $this->tag->checkField(array('check_1', 'value' => 'Y')); ?>checkbox test

//出力されたhtmlコード
<input type="checkbox" id="check_1" name="check_1" value="Y">checkbox test
radio_field
radio buttonタイプのinputタグを生成する。タグの定義は

radio_field(パラメータ)

例は

//volt
{{radio_field("radio_1","value":"Y")}}radio test

//コンパイルされたphp
<?php echo $this->tag->radioField(array('radio_1', 'value' => 'Y')); ?>radio test

//出力されたhtmlコード
<input type="radio" id="radio_1" name="radio_1" value="Y">radio test
date_field
dateタイプのinputタグを生成する。タグの定義は

date_field(パラメータ)

例は

//volt
{{date_field("radio_1","value":"2000-12-12","min":"1995-12-12")}}

//コンパイルされたphp
<?php echo $this->tag->dateField(array('radio_1', 'value' => '2000-12-12', 'min' => '1995-12-12')); ?>

//出力されたhtmlコード
<input type="date" id="radio_1" name="radio_1" value="2000-12-12" min="1995-12-12">
email_field
emailタイプのinputタグを生成する。タグの定義は

email_field(パラメータ)

例は

//volt
{{email_field("email_a","placeholder":"sample@example")}}

//コンパイルされたphp
<?php echo $this->tag->emailField(array('email_a', 'placeholder' => 'sample@example')); ?>

//出力されたhtmlコード
<input type="email" id="email_a" name="email_a" placeholder="sample@example">
numeric_field
numberタイプのinputタグを生成する。タグの定義は

numeric_field(パラメータ)

例は

//volt
{{numeric_field("num_a","min":0,"max":100,"step":5)}}

//コンパイルされたphp
<?php echo $this->tag->numericField(array('num_a', 'min' => 0, 'max' => 100, 'step' => 5)); ?>

//出力されたhtmlコード
<input type="number" id="num_a" name="num_a" min="0" max="100" step="5">
submit_button
submitボタンタグを生成する。タグの定義は

submit_button(パラメータ)

例は

//volt
{{submit_button("save","class":"btn")}}

//コンパイルされたphp
<?php echo $this->tag->submitButton(array('save', 'class' => 'btn')); ?>

//出力されたhtmlコード
<input type="submit" value="save" class="btn">
select_static
selectタグを生成する。optionsにはphp配列を利用する。タグの定義は

select_static(パラメータ)

例は

//volt
{% set options = ["a":"AAA","b":"BBB","c":"CCC"] %}
{{ select_static("select_form", options) }}

//コンパイルされたphp
<?php $options = array('a' => 'AAA', 'b' => 'BBB', 'c' => 'CCC'); ?>
<?php echo $this->tag->selectStatic(array('select_form', $options)); ?>

//出力されたhtmlコード
<select id="select_form" name="select_form">
	<option value="a">AAA</option>
	<option value="b">BBB</option>
	<option value="c">CCC</option>
</select>

セレクトボックスの初期表示を指定(selected)

//volt
{% set options = ["a":"AAA","b":"BBB","c":"CCC"] %}
{{ set_default("select_form","b") }}
{{ select_static("select_form", options) }}
selectのフォームのnameをset_defaultで指定する必要がある。

//コンパイルされたphp
<?php $options = array('a' => 'AAA', 'b' => 'BBB', 'c' => 'CCC'); ?>
<?php echo $this->tag->setDefault('select_form', 'b'); ?>
<?php echo $this->tag->selectStatic(array('select_form', $options)); ?>

//出力されたhtmlコード
<select id="select_form" name="select_form">
	<option value="a">AAA</option>
	<option selected="selected" value="b">BBB</option>
	<option value="c">CCC</option>
</select>
select
selectタグを生成する。optionsにはモデルの検索結果を利用する。タグの定義は

select(パラメータ)

例は

//volt
{{ select("type", productTypes, 'using': ['id', 'name']) }}
//productTypesはコントローラにてmodelを利用したデータの検索結果とする。
//usingはモデルのフィールド名を指定

//コンパイルされたphp
<?php echo Phalcon\Tag::select(array('type', $productTypes, 'using' => array('id', 'name'))); ?>

//出力されたhtmlコード
<select id="type" name="type">
	<option value="1">AAA</option>
	<option value="2">BBB</option>
	<option value="3">CCC</option>
</select>
text_area
textareaタグを生成する。タグの定義は

text_area(パラメータ)

例は

//volt
{{ set_default("comments","※※※※※※※※※※※※") }}
{{ text_area("comments", "cols": 30, "rows": 4) }}
text_areaのフォームのnameをset_defaultで指定する必要がある。

//コンパイルされたphp
<?php echo $this->tag->setDefault('comments', '※※※※※※※※※※※※'); ?>
<?php echo $this->tag->textArea(array('comments', 'cols' => 30, 'rows' => 4)); ?>

//出力されたhtmlコード
<textarea id="comments" name="comments" cols="30" rows="4">※※※※※※※※※※※※</textarea>
formとend_form
formタグを生成する。タグの定義は

//volt
{{ form("posts/save", "method": "post") }}
//inputコンポーネント記述
{{ end_form() }}

//コンパイルされたphp
<?php echo $this->tag->form(array('posts/save', 'method' => 'post')); ?>
<?php echo $this->tag->endForm(); ?>

//出力されたhtmlコード
<form action="/posts/save" method="post">
	//inputコンポーネント記述
</form>
get_title
titleタグを生成する。

//コントローラ内にて
$this->tag->prependTitle('INVO | ');
//サイト内共通タイトルの設定
$this->tag->setTitle('ようこそ');
//コントローラもしくはコントローラ内のアクションごとに追加のタイトルを設定

//volt
{{ get_title() }}

//コンパイルされたphp
<?php echo $this->tag->getTitle(); ?>

//出力されたhtmlコード
<title>INVO | ようこそ</title>
stylesheet_link
スタイルシート読み込みタグを生成する。

//volt
{{ stylesheet_link('css/bootstrap.min.css') }}

//コンパイルされたphp
<?php echo $this->tag->stylesheetLink('css/bootstrap.min.css'); ?>

//出力されたhtmlコード
<link rel="stylesheet" type="text/css" href="/css/bootstrap.min.css">
javascript_include
javascript読み込みタグを生成する。

//volt
{{ javascript_include('js/jquery.min.js') }}

//コンパイルされたphp
<?php echo $this->tag->javascriptInclude('js/jquery.min.js'); ?>

//出力されたhtmlコード
<script type="text/javascript" src="/js/jquery.min.js"></script>
image
img(画像)タグを生成する。

//volt
{{ image("img/photo.jpg", "alt": "Some Photo") }}

//コンパイルされたphp
<?php echo $this->tag->image(array('img/photo.jpg', 'alt' => 'Some Photo')); ?>

//出力されたhtmlコード
<img src="/invo/img/photo.jpg" alt="Some Photo">

続きはvol3(只今、執筆中)へ


投稿日: 2016年1月13日
カテゴリー: phalcon|php | 投稿者: