ビュー

"foa/html-view-bundle": "2.*"composer.json に追加し composer update を実行してインストールしましょう。

出力をエスケープする

テンプレートで値を出力する際は、セキュリティのため 常に 適切なエスケープを行うようにしましょう。 HTMLテンプレートなら、HTMLエスケーピング、 CSSテンプレートならCSSエスケーピング、XMLテンプレートならXMLエスケーピング、 PDFテンプレートならPDFエスケーピング、 RTFテンプレートならRTFエスケーピング…という事です。

ビューテンプレートの登録

Aura\View\View オブジェクトを持っていると仮定しましょう、ビューレジストリへテンプレートを登録してみます。 これは一般的にPHPファイルへのパスを設定しますが、クロージャを使う事も出来ます。 一般的な例を下記に示します。:

<?php
$view_registry = $view->getViewRegistry();
$view_registry->set('browse', '/path/to/views/browse.php');
?>

browse.php は下記のようなファイルです。:

<?php
foreach ($this->items as $item) {
    $id = $this->escape()->html($item['id']);
    $name = $this->escape()->html($item['name']);
    echo "Item ID #{$id} is '{$name}'." . PHP_EOL;
?>

テンプレートで、return ではなく、echo を使用している事に注目してください。

テンプレートのロジックは、 View オブジェクトのスコープ内で実行されます, これはテンプレート内の $thisView オブジェクトを参照する事を意味します。 クロージャベースのテンプレートも同じです。

データのセット

大抵の場合、テンプレートにはダイナミックなデータを使用したいと思うでしょう。データを view へセットするには、setdata() メソッドを使用します。 配列でもオブジェクトでも大丈夫です。そしてこれらのデータは view オブジェクトのプロパティとして利用できます。

<?php
$view->setData(array(
    'items' => array(
        array(
            'id' => '1',
            'name' => 'Foo',
        ),
        array(
            'id' => '2',
            'name' => 'Bar',
        ),
        array(
            'id' => '3',
            'name' => 'Baz',
        ),
    )
));
?>

テンプレートロジック内の $thisView オブジェクトを参照する事を覚えていますか? View へ設定されたデータは $this のプロパティとしてアクセスできます。

setData() メソッドは_View_ オブジェクトの全てのデータを上書きします。一方で、addData() メソッドは View オブジェクトへ設定されているデータとマージします。

ビューの呼び出し

さあ、テンプレートを登録していくつかデータを View にセットしてきました、View に描画するテンプレートを設定し、invoke(呼び出し)してみましょう!

<?php
$view->setView('browse');
$output = $view->__invoke(); // あるいは単に $view() とする事も出来ます。
?>

$output は下記のような出力になります。

Item #1 is 'Foo'.
Item #2 is 'Bar'.
Item #3 is 'Baz'.

サブテンプレートを使う (“パーシャル”)

テンプレートを部分的に分割したいというような時があります。こういった部分的な “パーシャル” テンプレートは、メインテンプレート内で render() メソッドを使用して描画を行います。

まずはじめに、ビューレジストリへサブテンプレートを登録します。(レイアウトのために使用する場合はレイアウトレジストリになります) それから、メインテンプレート内で render() を実行します。サブテンプレートには好きなネームスキームを使用できます。 いくつかのシステムでは、アンダースコアをプレフィックスに使用する習慣があります。下記の例もそのようにしてあります。

次に、パーシャルテンプレートで利用するために、変数群の配列を渡します。($this 変数は常に利用できます)

例として, browse.php テンプレートを分割してアイテムを表示する部分をサブテンプレートとして切り出してみましょう。

<?php
// ビューレジストリへテンプレートを登録します。
$view_registry = $view->getViewRegistry();

// メインテンプレート
$view_registry->set('browse', '/path/to/views/browse.php');

// サブテンプレート
$view_registry->set('_item', '/path/to/views/_item.php');
?>

browse.php からアイテム表示を行うコードを _item.php へ移行します。:

<?php
$id = $this->escape()->html($item['id']);
$name = $this->escape()->html($item['name']);
echo "Item ID #{$id} is '{$name}'." . PHP_EOL;
?>

それから、 browse.php をサブテンプレートを使うように変更します。:

<?php
foreach ($this->items as $item) {
    echo $this->render('_item', array(
        'item' => $item,
    ));
?>

出力は前例でビューを呼び出した時の物と同じになります。

または、 include あるいは require を使って 現在のテンプレートスコープで直接PHPファイルを実行する事も出来ます。

セクションを使う

セクションはサブテンプレートと似ていますが、セクションについては後々の描画のために出力のキャプチャーを行う点が異なります。 一般的に、ビューテンプレートに使用され、レイアウトテンプレートのために出力をキャプチャーします。

例えば、ビューテンプレートの出力を指定のセクションにキャプチャーします …

<?php
// 指定されたセクションへの出力のバッファリングを行います。
$this->beginSection('local-nav');

echo "<div>";
// ... ナビゲーションを出力します ...
echo "</div>";

// バッファリングを終了して、出力をキャプチャーします。
$this->endSection();
?>

… それからレイアウトテンプレートで出力します。

<?php
if ($this->hasSection('local-nav')) {
    echo $this->getSection('local-nav');
} else {
    echo "<div>No local navigation.</div>";
}
?>

加えて、setSection() メソッドはキャプチャーの代わりに、直接下記のように設定することも出来ます。

<?php
$this->setSection('local-nav', $this->render('_local-nav.php'));
?>

2ステップビューの描画

レイアウトの中でメインコンテンツをラップするために、まずレイアウトテンプレートを View に登録して、setLayout() メソッドを使いセットします。(もしレイアウトが設定されていなければ、実行されません。)

ビューレジストリへ browse テンプレートを登録していると仮定します。default レイアウトテンプレートをレイアウトレジストリへ登録してみましょう。:

<?php
$layout_registry = $view->getLayoutRegistry();
$layout_registry->set('default', '/path/to/layouts/default.php');
?>

default.php レイアウトテンプレートは下記のようなファイルです。:

<html>
<head>
    <title>My Site</title>
</head>
<body>
<?= $this->getContent(); ?>
</body>
</html>

それから View オブジェクトに、ビューとレイアウトを設定して呼び出します。

<?php
$view->setView('browse');
$view->setLayout('default');
$output = $view->__invoke(); // あるいは単に $view() とする事も出来ます。
?>

内側のビューテンプレートからの出力は保持され View オブジェクトの getContent() メソッドから利用できるようになります。レイアウトテンプレートはそれから getContent() を呼び出しレイアウトテンプレートに、ビューの結果を出力します。

ビューテンプレートから、setLayout() を呼ぶ事も出来ます。 ビューロジックの一部としてレイアウトを選択する事が可能です。

ビューテンプレートとレイアウトテンプレートは同じ View オブジェクトの中で実行されます。つまり:

  • 全てのデータは、ビューとレイアウト間で共有されます。ビューにセットされたデータや、ビューによって変更されたデータはレイアウトからもそのまま使えます。

  • 全てのヘルパーは、ビューとレイアウト間で共有されます。レイアウトが実行されるまえにビューからデータやヘルパーを変更できます。

  • 全てのセクションボディは、ビューとレイアウト間で共有されます。よって、ビューテンプレートからキャプチャーされたセクションがレイアウトテンプレートからも利用できます。

テンプレートとしてのクロージャ

ビュー、及びレイアウトレジストリにはクロージャもテンプレートとして登録する事が出来ます。 下記は、 browse.php_item.php テンプレートでクロージャを利用した例です。

<?php
$view_registry->set('browse', function () {
    foreach ($this->items as $item) {
        echo $this->render('_item', array(
            'item' => $item,
        ));
    }
);

$view_registry->set('_item', function (array $vars) {
    extract($vars, EXTR_SKIP);
    $id = $this->escape()->html($item['id']);
    $name = $this->escape()->html($item['name']);
    echo "Item ID #{$id} is '{$name}'." . PHP_EOL;
);
?>

クロージャベースのテンプレートを登録する時は、出力時に return ではなく echo を使うようにしましょう。 クロージャは View オブジェクトに返るので、 ファイルベースのテンプレートと同様にクロージャの $thisView を参照するようになります。

クロージャベースでサブテンプレートを利用する場合は少し追加の作業が必要になります。ファイルベースのテンプレートでは、セットされたデータを含む配列を自動的にローカルスコープに展開してくれますが、クロージャベースのテンプレートでは以下の作業が必要になります:

  1. 注入された変数を受け取るパラメーターを関数に定義しましょう。(_item テンプレート内の $vars パラメーターです)

  2. extract()を使って注入された変数を展開します。または、注入された変数をそのまま直接使う事も出来ます。

上記を除き、クロージャベースのテンプレートはファイルベースのテンプレートと同様に機能します。

Aura.Htmlでのビルトインヘルパー

エスケーパー

出力のエスケープは、セキュリティの観点から 絶対に必要不可欠 です。このパッケージの、escape() ヘルパーには4つのメソッドがあります:

  • $this->escape()->html('foo') HTMLのエスケープに使用します。
  • $this->escape()->attr('foo') HTML属性のエスケープに使用します。
  • $this->escape()->css('foo') CSSのエスケープに使用します。
  • $this->escape()->js('foo') JavaScriptのエスケープに使用します。

下記にいくつか escape() ヘルパーの使用例を示します:

<head>

    <style>
        body: {
            color: <?= $this->escape()->css($theme->color) ?>;
            font-size: <?= $this->escape()->css($theme->font_size) ?>;
        }
    </style>

    <script language="javascript">
        var foo = "<?= $this->escape()->js($js->foo); ?>";
    </script>

</head>

<body>

    <h1><?= $this->escape()->html($blog->title) ?></h1>

    <p class="byline">
        by <?= $this->escape()->html($blog->author) ?>
        on <?= $this->escape()->html($blog->date) ?>
    </p>

    <div id="<?php $this->escape()->attr($blog->div_id) ?>">
        <?= $blog->raw_html ?>
    </div>

</body>

不幸なことに、エスケープの処理はくどく、テンプレートのコードは酷く散らかったように見えます。これを和らげるために、2つの方法があります。

1つ目の方法は、escape() ヘルパーを変数にセットして、呼び出すようにする事です。下記は例です。

<?php
// エスケープヘルパーを呼び出し可能な変数にセットします。
$h = $this->escape()->html;
$a = $this->escape()->attr;
$c = $this->escape()->css;
$j = $this->escape()->js;
?>

<head>

    <style>
        body: {
            color: <?= $c($theme->color) ?>;
            font-size: <?= $c($theme->font_size) ?>;
        }
    </style>

    <script language="javascript">
        var foo = "<?= $j($js->foo); ?>";
    </script>

</head>

<body>

    <h1><?= $h($blog->title) ?></h1>

    <p class="byline">
        by <?= $h($blog->author) ?>
        on <?= $h($blog->date) ?>
    </p>

    <div id="<?php $a($blog->div_id) ?>">
        <?= $blog->raw_html ?>
    </div>

</body>

2つ目の方法は、 escape() ヘルパーに使用される Escaper クラスに実装されている4つのstaticメソッドを使う事です。:h(), a(), c(), j() 順番に、HTMLのエスケープ、HTML属性のエスケープ、CSSのエスケープ、JavaScriptのエスケープを行います。

注意 : Auraでは、基本的にstaticメソッドの利用を避けています。しかし、この場合ではテンプレートの可読性のためのトレードオフです。

PHPベースのテンプレートで、static Escaper メソッドを呼び出すためには、use を使って Escaper のエイリアスを定義します。それから、エイリアスからstaticメソッドを呼び出します。 (もし、HelperLocatorFactory のインスタンスを生成していない場合は、Escaper::setStatic(new Escaper) を呼び出す必要があります。)

下記は、staticメソッドを使用した例です:

<?php use Aura\Html\Escaper as e; ?>

<head>

    <style>
        body: {
            color: <?= e::c($theme->color) ?>;
            font-size: <?= e::c($theme->font_size) ?>;
        }
    </style>

    <script language="javascript">
        var foo = "<?= e::j($js->foo); ?>";
    </script>

</head>

<body>

    <h1><?= e::h($blog->title) ?></h1>

    <p class="byline">
        by <?= e::h($blog->author) ?>
        on <?= e::h($blog->date) ?>
    </p>

    <div id="<?php e::a($blog->div_id) ?>">
        <?= $blog->raw_html ?>
    </div>

</body>

タグヘルパー

HelperLocator のメソッドとしてヘルパーを使用できます。 利用できるヘルパーの一覧です:

フォームのためのヘルパー もあります。

a

<a> タグヘルパー

<?php
echo $this->a(
    'http://auraphp.com',       // (string) href
    'Aura Project',             // (string) text
    array('id' => 'aura-link')  // (array) optional attributes
);
?>
<a href="http://auraphp.com" id="aura-link">Aura Project</a>

base

<base> タグヘルパー

<?php
echo $this->base(
    '/base' // (string) href
);
?>
<base href="/base" />

img

<img> タグヘルパー

<?php
echo $this->img(
    '/images/hello.jpg',            // (string) image href src
    array('id' => 'image-id');      // (array) optional attributes
?>
<!-- もし、alt属性が設定されていない場合は画像ファイル名を使用します。 -->
<img src="/images/hello.jpg" alt="hello" id="image-id">

label

<label> タグヘルパー

<?php
echo $this->label(
    'Label For Field',          // (string) label text
    array('for' => 'field'));   // (array) optional attributes
?>
<label for="field">Label For Field</label>

<?php
// ラベルタグで包括し、ラベルのテキストはinputタグの前に出力されます。
echo $this->label('Foo: ')
            ->before($this->input(array(
                'type' => 'text',
                'name' => 'foo',
            )));
?>
<label>Foo: <input type="text" name="foo" value="" /></label>

<?php
// ラベルタグで包括し、ラベルのテキストはinputタグの後に出力されます。
echo $this->label(' (Foo)')
            ->after($this->input(array(
                'type' => 'text',
                'name' => 'foo',
            )));
?>
<label><input type="text" name="foo" value="" /> (Foo)</label>

<link> タグヘルパーです、 リンクを add() メソッドで追加し、それから出力します。

<?php
// add() メソッドを使い、リンクを配列で追加します。
$this->links()->add(array(
    'rel' => 'prev',                // (array) link attributes
    'href' => '/path/to/prev',
));

$this->links()->add(array(        // (array) link attributes
    'rel' => 'next',
    'href' => '/path/to/next',
));

// リンクの出力をします。
echo $this->links();
?>
<link rel="prev" href="/path/to/prev" />
<link ref="next" href="/path/to/next" />

<?php
// また、add() コールをメソッドチェーンして出力する事も出来ます。
echo $this->links()
    ->add(array(                    // (array) link attributes
        'rel' => 'prev',
        'href' => '/path/to/prev',
    ))
    ->add(array(                    // (array) link attributes
        'rel' => 'next',
        'href' => '/path/to/next',
    ));
?>
<link rel="prev" href="/path/to/prev" />
<link ref="next" href="/path/to/next" />

metas

<meta> タグヘルパーです。 add*() メソッドで追加し、出力します。

<?php
// http-equivalent metaの追加をします。
$this->metas()->addHttp(
    'Location',         // (string) header label
    '/redirect/to/here' // (string) header value
);

// name metaの追加をします。
$this->metas()->addName(
    'foo',              // the meta name
    'bar'               // the meta content
);

// metasの出力をします。
echo $this->meta();
?>
<meta http-equiv="Location" content="/redirect/to/here">
<meta name="foo" content="bar">

<?php
// また、add() コールをメソッドチェーンして出力する事も出来ます。
echo $this->metas()
    ->addHttp(
        'Location',         // (string) header label
        '/redirect/to/here' // (string) header value
    )
    ->addName(
        'foo',              // the meta name
        'bar'               // the meta content
    );
?>
<meta http-equiv="Location" content="/redirect/to/here">
<meta name="foo" content="bar">

ol

<ol> タグ 、及び <li> アイテムを出力するタグヘルパーです。タグを生成した後 (そのままの値かエスケープされた値) で出力を行います。

<?php
// リストを開始します。
$this->ol(array(                  // (array) optional attributes
    'id' => 'test',
));

// アイテムを追加します。(エスケープされます)
$this->ol()->item(
    'foo',                          // (string) the item text
    array('id' => 'foo')            // (array) optional attributes
);

// いくつかのアイテムをまとめて追加します。(エスケープされます)
$this->ol()->items(array(         // (array) the items to add
    'bar',                          // the item text, no item attributes
    'baz' => array('id' => 'baz'),  // item text with item attributes
));

// アイテムを追加します。(エスケープされません)
$this->ol()->rawItem(
    '<a href="/first">First</a>',   // (string) the raw item html
    array('id' => 'first')          // (array) optional attributes
);

// いくつかのアイテムをまとめて追加します。(エスケープされません)
$this->ol()->rawItems(array(         // (array) the raw items to add
    '<a href="/prev">Prev</a>',     // the item text, no item attributes
    '<a href="/next">Next</a>',
    '<a href="/last">Last</a>' => array('id' => 'last') // text and attributes
));

// リストを出力します。
echo $this->ol();
?>
<ol id="test">
    <li id="foo">foo</li>
    <li>bar</li>
    <li id="baz">baz</li>
    <li><a href="/first">First</a></li>
    <li><a href="/pref">First</a></li>
    <li><a href="/next">First</a></li>
    <li><a href="/last">First</a></li>
</ol>

scripts

<script> タグヘルパーです。リンクをセットして出力します。

<?php
// scriptを追加します。
$this->scripts()->add('/js/middle.js');

// 続けてscriptを追加します。
$this->add('/js/last.js');

// 優先度を設定して追加します。
echo $this->scripts(
    '/js/first.js',     // (string) the script src
    50                  // (int) optional priority order (default 100)
);

// 条件に応じたscriptを追加します。
$this->scripts->addCond(
    'ie6',              // (string) the condition
    '/js/ie6.js',       // (string) the script src
    25                  // (int) optional priority order (default 100)
));

?>
<!--[if ie6]><script src="/js/ie6.js" type="text/javascript"></script><![endif]-->
<script src="/js/first.js" type="text/javascript"></script>
<script src="/js/middle.js" type="text/javascript"></script>
<script src="/js/last.js" type="text/javascript"></script>

scriptsFoot() ヘルパーも同じように機能します。ただし、このヘルパーはHTMLボディの最後に出力を行います。

ul

<ul> タグ 、及び <li> アイテムを出力するタグヘルパーです。タグを生成した後 (そのままの値かエスケープされた値) で出力を行います。

<?php
// リストを開始します。
$this->ul(array(                  // (array) optional attributes
    'id' => 'test',
));

// アイテムを追加します。(エスケープされます)
$this->ul()->item(
    'foo',                          // (string) the item text
    array('id' => 'foo')            // (array) optional attributes
);

// いくつかのアイテムをまとめて追加します。(エスケープされます)
$this->ul()->items(array(         // (array) the items to add
    'bar',                          // the item text, no item attributes
    'baz' => array('id' => 'baz'),  // item text with item attributes
));

// アイテムを追加します。(エスケープされません)
$this->ul()->rawItem(
    '<a href="/first">First</a>',   // (string) the raw item html
    array('id' => 'first')          // (array) optional attributes
);

// いくつかのアイテムをまとめて追加します。(エスケープされません)
$this->ul()->rawItems(array(      // (array) the raw items to add
    '<a href="/prev">Prev</a>',     // the item text, no item attributes
    '<a href="/next">Next</a>',
    '<a href="/last">Last</a>' => array('id' => 'last') // text and attributes
));

// リストを出力します。
echo $this->ul();
?>
<ul id="test">
    <li id="foo">foo</li>
    <li>bar</li>
    <li id="baz">baz</li>
    <li><a href="/first">First</a></li>
    <li><a href="/prev">Prev</a></li>
    <li><a href="/next">Next</a></li>
    <li><a href="/last">Last</a></li>
</ul>

styles

<link> タグヘルパーです、リンクを生成した後、出力します。script ヘルパーと同じで、それぞれのスタイルシートに優先度を設定することも出来ます。

<?php
// スタイルシートへのリンクを追加します。
$this->styles()->add(
    '/css/middle.css',          // (string) the stylesheet href
    array('media' => 'print')   // (array) optional attributes
);

// 続けて追加します。
$this->styles()->add('/css/last.css');

// 設定した優先度で追加します。
$this->styles()->add(
    '/css/first.css',           // (string) the stylesheet href
    null,                       // (array) optional attributes
    50                          // (int) optional priority order (default 100)
);

// 条件に応じて追加します。
$this->styles()->addCond(
    'ie6',                      // (string) the condition
    '/css/ie6.css',             // (string) the stylesheet href
    array('media' => 'print'),  // (array) optional attributes
    25                          // (int) optional priority order (default 100)
);

// 出力します。
echo $this->styles();
?>
<!--[if ie6]><link rel="stylesheet" href="/css/ie6.css" type="text/css" media="print" /><![endif]-->
<link rel="stylesheet" href="/css/first.css" type="text/css" media="screen" />
<link rel="stylesheet" href="/css/middle.css" type="text/css" media="print" />
<link rel="stylesheet" href="/css/last.css" type="text/css" media="screen" />
?>

tag

一般的なタグのヘルパーです。

<?php
echo $this->tag(
    'div',                  // (string) the tag name
    array('id' => 'foo')    // (array) optional array of attributes
);
echo $this->tag('/div');
?>
<div id="foo"></div>

title

<title> タグのためのヘルパー

<?php
// エスケープされたバージョン (部分的にエスケープしないようにする事も可能です)

// タイトルをセットします
$this->title()->set('This & That');

// appendはタイトルの後に追加します。
$this->title()->append(' > Suf1');
$this->title()->append(' > Suf2');

// prependはタイトルの前に追加します。
$this->title()->prepend('Pre1 > ');
$this->title()->prepend('Pre2 > ');

echo $this->title();
?>
<title>Pre2 &gt; Pre1 &gt; This &amp; That &gt; Suf1 &gt; Suf2</title>

<?php
// エスケープされないバージョン (部分的にエスケープする事も可能です):

// タイトルをセットします
$this->title()->set('This & That');

// appendはタイトルの後に追加します。
$this->title()->append(' > Suf1');
$this->title()->append(' > Suf2');

// prependはタイトルの前に追加します。
$this->title()->prepend('Pre1 > ');
$this->title()->prepend('Pre2 > ');

echo $this->title();
?>
<title>Pre2 > Pre1 > This & That > Suf1 > Suf2</title>

フォームヘルパー

フォームエレメント

formタグは下記のように利用します:

<?php
echo $this->form(array(
    'id' => 'my-form',
    'method' => 'put',
    'action' => '/hello-action',
));

echo $this->tag('/form');
?>
<form id="my-form" method="put" action="/hello-action" enctype="multipart/form-data"></form>

HTML 5 Input エレメント

全てのHTML 5 input ヘルパーは同じ用法で利用します。input エレメントのフォーマットに配列を使用します。

<?php
echo $this->input(array(
    'type'    => $type,     // (string) the element type
    'name'    => $name,     // (string) the element name
    'value'   => $value,    // (string) the current value of the element
    'attribs' => array(),   // (array) element attributes
    'options' => array(),   // (array) options for select and radios
));
?>

配列を用いる事で特殊な用途においても、Aura.Html に依存する事なく他ライブラリがフォームのエレメントを生成する事が出来ます。

type の値で有効なinputのエレメント一覧:

button

<?php
echo $this->input(array(
    'type'    => 'button',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array()
));
?>
<input type="button" name="foo" value="bar" />

checkbox

checkbox タイプは擬似属性の value_unchecked 使って (もうお分りかもしれませんが) hidden エレメントの未チェックの値を設定するために使用します。 また label 擬似属性は、チェックボックスの後に置かれるラベルテキストを設定することが出来ます。

<?php
echo $this->input(array(
    'type'    => 'checkbox',
    'name'    => 'foo',
    'value'   => 'y',               // the current value
    'attribs' => array(
        'label' => 'Check me',      // the checkbox label
        'value' => 'y',             // the value when checked
        'value_unchecked' => '0',   // the value when unchecked
    ),
));
?>
<input type="hidden" name="foo" value="n" />
<label><input type="checkbox" name="foo" value="y" checked /> Check me</label>

color

<?php
echo $this->input(array(
    'type'    => 'color',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array()
));
?>
<input type="color" name="foo" value="bar" />

date

<?php
echo $this->input(array(
    'type'    => 'date',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array()
));
?>
<input type="date" name="foo" value="bar" />

datetime

<?php
echo $this->input(array(
    'type'    => 'datetime',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array()
));
?>
<input type="datetime" name="foo" value="bar" />

datetime-local

<?php
echo $this->input(array(
    'type'    => 'datetime-local',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array()
));
?>
<input type="datetime-local" name="foo" value="bar" />

email

<?php
echo $this->input(array(
    'type'    => 'email',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array()
));
?>
<input type="email" name="foo" value="bar" />

file

<?php
echo $this->input(array(
    'type'    => 'file',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array()
));
?>
<input type="file" name="foo" value="bar" />

hidden

<?php
echo $this->input(array(
    'type'    => 'hidden',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array()
));
?>
<input type="hidden" name="foo" value="bar" />

image

<?php
echo $this->input(array(
    'type'    => 'image',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array()
));
?>
<input type="image" name="foo" value="bar" />

month

<?php
echo $this->input(array(
    'type'    => 'month',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array()
));
?>
<input type="month" name="foo" value="bar" />

number

<?php
echo $this->input(array(
    'type'    => 'number',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array()
));
?>
<input type="number" name="foo" value="bar" />

password

<?php
echo $this->input(array(
    'type'    => 'password',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array()
));
?>
<input type="password" name="foo" value="bar" />

radio

このタイプは1つのラジオ、あるいは options を設定する事で複数のラジオを生成する事ができます。

<?php
echo $this->input(array(
    'type'    => 'radio',
    'name'    => 'foo',
    'value'   => 'bar',     // (string) the currently selected radio
    'attribs' => array(),
    'options' => array(     // (array) `value => label` pairs
        'bar' => 'baz',
        'dib' => 'zim',
        'gir' => 'irk',
    ),
));
?>
<label><input type="radio" name="foo" value="bar" checked /> baz</label>
<label><input type="radio" name="foo" value="dib" /> zim</label>
<label><input type="radio" name="foo" value="gir" /> irk</label>

range

<?php
echo $this->input(array(
    'type'    => 'range',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array()
));
?>
<input type="range" name="foo" value="bar" />

reset

<?php
echo $this->input(array(
    'type'    => 'reset',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array()
));
?>
<input type="reset" name="foo" value="bar" />
<?php
echo $this->input(array(
    'type'    => 'search',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array()
));
?>
<input type="search" name="foo" value="bar" />

select

<select> タグ、及び <option> タグのヘルパーです。 擬似属性の placeholder は未選択時のプレイスホルダーとして扱われます。 'multiple' => true を を設定すると複数選択可能になります。そしてもし設定されていなければ、自動的にname属性に [] を追加します。

<?php
echo $this->input(array(
    'type'    => 'select',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array(
        'placeholder' => 'Please pick one',
    ),
    'options' => array(
        'baz' => 'Baz Label',
        'dib' => 'Dib Label',
        'bar' => 'Bar Label',
        'zim' => 'Zim Label',
    ),
));
?>
<select name="foo">
    <option disabled value="">Please pick one</option>
    <option value="baz">Baz Label</option>
    <option value="dib">Dib Label</option>
    <option value="bar" selected>Bar Label</option>
    <option value="zim">Zim Label</option>
</select>

<?php
// selectタグを作成します。
$select = $this->input(array(
    'type'    => 'select',
    'name'    => 'foo',
));

// 現在選択されている値を設定できます。
$select->selected('bar');   // (string|array) the currently selected value(s)

// selectタグへ属性を設定します。
$select->attribs(array(
    'placeholder' => 'Please pick one',
));

// optionを追加します。
$select->option(
    'baz',                  // (string) the option value
    'Baz Label',            // (string) the option label
    array()                 // (array) optional attributes for the option tag
);

// 複数のoptionを追加します。
$select->options(array(
    'dib' => 'Dib Label',
    'bar' => 'Bar Label',
    'zim' => 'Zim Label',
));

// selectタグを出力します。
echo $select;
?>
<select name="foo">
    <option disabled value="">Please pick one</option>
    <option value="baz">Baz Label</option>
    <option value="dib">Dib Label</option>
    <option value="bar" selected>Bar Label</option>
    <option value="zim">Zim Label</option>
</select>

このヘルパーはoptionのグループ化にも対応しています。もし、options の値が配列の場合は配列のキーが <optgroup> のラベルに使用されます。

<?php
echo $this->input(array(
    'type'    => 'select',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array(),
    'options' => array(
        'Group A' => array(
            'baz' => 'Baz Label',
            'dib' => 'Dib Label',
        ),
        'Group B' => array(
            'bar' => 'Bar Label',
            'zim' => 'Zim Label',
        ),
    ),
));
?>
<select name="foo">
    <optgroup label="Group A">
        <option value="baz">Baz Label</option>
        <option value="dib">Dib Label</option>
    </optgroup>
    <optgroup label="Group B">
        <option value="bar" selected>Bar Label</option>
        <option value="zim">Zim Label</option>
    </optgroup>
</select>

<?php
// 別の例を示します。
$select = $this->input(array(
    'type'    => 'select',
    'name'    => 'foo',
));

// 現在選択されている値を設定できます。
$select->selected('bar');   // (string|array) the currently selected value(s)

// optionのグループを作成します。
$select->optgroup('Group A');

// 複数のoptionを追加します。
$select->options(array(
    'baz' => 'Baz Label',
    'dib' => 'Dib Label',
));

// 別のoptionのグループを作成します。 (サブグループはHTMLの規格上出来ません)
$select->optgroup('Group B');

// optionを追加します。
$select->option(
    'bar',                  // (string) the option value
    'Bar Label',            // (string) the option label
    array()                 // (array) optional attributes for the option tag
);

// optionを追加します。
$select->option(
    'zim',                  // (string) the option value
    'Zim Label',            // (string) the option label
    array()                 // (array) optional attributes for the option tag
);

// selectタグを出力します。
echo $select;
?>
<select name="foo">
    <optgroup label="Group A">
        <option value="baz">Baz Label</option>
        <option value="dib">Dib Label</option>
    </optgroup>
    <optgroup label="Group B">
        <option value="bar" selected>Bar Label</option>
        <option value="zim">Zim Label</option>
    </optgroup>
</select>

submit

<?php
echo $this->input(array(
    'type'    => 'submit',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array()
));
?>
<input type="submit" name="foo" value="bar" />

tel

<?php
echo $this->irnput(array(
    'type'    => 'tel',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array()
));
?>
<input type="tel" name="foo" value="bar" />

text

<?php
echo $this->input(array(
    'type'    => 'text',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array()
));
?>
<input type="text" name="foo" value="bar" />

textarea

<?php
echo $this->input(array(
    'type'    => 'textarea',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array()
));
?>
<textarea name="foo">bar</textarea>

time

<?php
echo $this->input(array(
    'type'    => 'time',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array()
));
?>
<input type="time" name="foo" value="bar" />

url

<?php
echo $this->input(array(
    'type'    => 'url',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array()
));
?>
<input type="url" name="foo" value="bar" />

week

<?php
echo $this->input(array(
    'type'    => 'week',
    'name'    => 'foo',
    'value'   => 'bar',
    'attribs' => array()
));
?>
<input type="week" name="foo" value="bar" />

カスタムヘルパー

カスタムヘルパーは下記の2ステップで追加できます。

  1. ヘルパークラスを作成します。

  2. HelperLocator へクラスのファクトリーをセットします。

ヘルパークラスに必要な事は、__invoke() メソッドを実装するだけです。 インデンティング、エスケーピングを利用したい場合は、 Aura\Html\AbstractHelper を継承する事を推奨しますが、 必須ではありません。

ここでは、定義済みのルーターから、新しいルーターを作成するためにルーターオブジェクトを返すヘルパーを作成してみます。

<?php
<?php
// {$PROJECT_PATH}/src/App/Html/Helper/Router.php
namespace App\Html\Helper;

use Aura\Html\Helper\AbstractHelper;
use Aura\Router\Router as AuraRouter;

class Router
{
    protected $router;

    public function __construct(AuraRouter $router)
    {
        $this->router = $router;
    }

    public function __invoke()
    {
        return $this->router;
    }
}

ヘルパークラスを作成したので、今度は HelperLocator にファクトリーをセットしてみます。 作成したヘルパークラスを返すように設定します。

{$PROJECT_PATH}/config/Common.php を編集します。

<?php
namespace Aura\Web_Project\_Config;

use Aura\Di\Config;
use Aura\Di\Container;

class Common extends Config
{
    public function define(Container $di)
    {
        // ...
        $di->params['App\Html\Helper\Router']['router'] = $di->lazyGet('aura/web-kernel:router');
        $di->params['Aura\Html\HelperLocator']['map']['router'] = $di->lazyNew('App\Html\Helper\Router');
    }
    // ...
}

HelperLocator のサービス名は、メソッド名も兼ねます。 これはヘルパーを $this->router() で呼び出せるという事です:

<?php echo $this->router()->generate('blog.read', array('id', 2)); ?>

ヘルペーのサービス名は自由につける事が出来ます。ヘルパークラスにサービス名をつけられるだけでなく、同じ名前でメソッドとしてコールできるのです。