テンプレートエンジン - 2(ループブロック、入れ子のブロック)

ブロック制御

前回はTemplateクラスのブロックと変数の制御について説明しました。今回はのようなループするブロックと、入れ子構造になっているブロックの出力について説明します。

ループの追加を行う

Templateクラスのaddメソッドは次のような引数を持ちます。

$Tpl->add( ブロック名(文字列), ブロック内変数( 連想配列 ) );

以下のようにaddメソッドで同じ名前のブロックを繰り返し追加することでループ構造を作ります。

テンプレート (HTML形式)

<html>
<body>
    <!-- BEGIN_MODULE Sample_Loop -->
    <ul>
        <!-- BEGIN data:loop -->
        <li>id : {id} {name} ( {kana} ) </li>
        <!-- END data:loop -->
    </ul>
    <!-- END_MODULE Sample_Loop -->
</body>
</html>

Sample_Loopモジュール

<?php

namespace Acms\Custom\GET\Sample;

use ACMS_GET;
use Template;
use ACMS_Corrector;

class Loop extends ACMS_GET
{
    function get()
    {
        $Tpl = new Template($this->tpl, new ACMS_Corrector());

        $loopData = array();
        $loopData[] = array(
            'id'       => '1',
            'name'     => '山田太郎',
            'kana'     => 'やまだたろう',
        );

        $loopData[] = array(
            'id'       => '2',
            'name'     => '鈴木次郎',
            'kana'     => 'すずきじろう',
        );

        $loopData[] = array(
            'id'       => '3',
            'name'     => '佐藤三郎',
            'kana'     => 'さとうさぶろう',
        );

        foreach ( $loopData as $loop ) {
            $Tpl->add('data:loop', $loop);
        }

        return $Tpl->get();
    }
}

実行結果

<html>
<body>
    <ul>
        <li>id : 1 山田太郎 ( やまだたろう )</li>
        <li>id : 2 鈴木次郎 ( すずきじろう )</li>
        <li>id : 3 佐藤三郎 ( さとうさぶろう )</li>
    </ul>
</body>
</html>

入れ子の順番

ブロックの追加は、入れ子の中の深い位置のブロック(子にあたるブロック)から順に追加します。ブロックを配列で表現して追加するときは、配列の先頭が追加する目標のブロック名であり、以降は親のブロック名をあらわすことに注意してください。

入れ子のテンプレート

<html>
<body>
<!-- BEGIN_MODULE Sample_Nest -->
    <!-- BEGIN year -->
        <!-- BEGIN month -->
            <!-- BEGIN day -->
            <!-- END day -->
        <!-- END month -->
    <!-- END year -->
<!-- END_MODULE Sample_Nest -->
</body>
</html>

Sample_Nestモジュール

<?php

namespace Acms\Custom\GET\Sample;

use ACMS_GET;
use Template;
use ACMS_Corrector;

class Nest extends ACMS_GET
{
    function get()
    {
        $Tpl     = new Template($this->tpl, new ACMS_Corrector());

        $Tpl->add( array('day', 'month', 'year') );

        $Tpl->add( array('month', 'year') );

        $Tpl->add( 'year' );

        return $Tpl->get();
    }
}

入れ子構造のループを追加する

ひとつのループの中で更に別のループがあるような入れ子型のループを作成します。以下のように、ブロック名の引数を配列にすることでループの中に別のループを追加できます。この入れ子型のブロックの追加はループに限らず共通です。

以下はカテゴリーのループ構造の中に、エントリーのループが加わる処理の例です。

    foreach ( $categories as $category ) {
        foreach ( $entries as $entry ) {
            // entry:loopを追加
            $Tpl->add(array('entry:loop', 'category:loop'), $entry);
        }
        // category:loopを追加
        $Tpl->add('category:loop', $category);
    }

Twitter ログイン機能についてのお知らせ

2016年1月28日現在、Twitter公式の仕様変更によりTwitterログイン機能をご利用いただけません。

次回リリースのバージョンで対応させていただく予定です。ご迷惑をおかけして恐縮ですが、ご理解のほどよろしくお願い申し上げます。

データベース関係クラスの使用(1) DB編

DBクラス

DBクラスは、a-blog cmsで使用しているデータベースへの接続を支援するクラスです。

インスタンスの作成

// DBクラス
DB = DB::singleton(dsn());

dsn関数は、a-blog cmsの組み込み関数で、config.server.phpに保存されているデータベース情報を、連想配列で返します。以降のサンプルで紹介されている箇所以外で、使用することはほとんどありません。

クエリーの発行

基本的なクエリーの発行と、結果を全件取得するサンプルを下記に示します。

$DB = DB::singleton(dsn());
$q = '`SELECT * FROM `acms_entry` LIMIT 0, 10';

/**
 * query
 * @param string $query
 * @param string $mode
 * @return mixed $response
 */

// クエリーの結果を全件取得する
$all = $DB->query($q, 'all');

クエリー発行の各モードの挙動

queryメソッドは、複数のモードを持ちます。それぞれのモードで、返り値が異なります。

all - 結果から全行を取得

結果を多次元配列として、全行取得します。

$q = '`SELECT * FROM `acms_entry` LIMIT 0, 10';
$all = $DB->query($q, 'all');

var_dump($all);
/*
dumpの結果

array(10)(
    [0] => array(21)(
        'entry_id' => 1,
        'entry_title' => 'サンプルレコード',
        'entry_code' => 'entry-1.html',
        ...
    ),
    [1] => array(21)(
        'entry_id' => 2,
        'entry_title' => 'サンプルレコード2',
        'entry_code' => 'entry-2.html',
        ...
    ),
    [2] => array(21)(
        'entry_id' => 3,
        'entry_title' => 'サンプルレコード3',
        'entry_code' => 'entry-3.html',
        ...
    ),
    ...
);
*/

row - 結果から1行を取得

結果から1行のみ取得します。結果が複数行だった場合は、先頭の1行を連想配列で返します。

$q = '`SELECT * FROM `acms_entry` WHERE `entry_id` = 1';
$row = $DB->query($q, 'row');

var_dump($row);
/*
dumpの結果

array(21)(
    'entry_id' => 1,
    'entry_title' => 'サンプルレコード',
    'entry_code' => 'entry-1.html',
    ...
)
*/

one - 結果から1つの値を取得

結果から1つの値を取得します。結果が複数列をもつ場合は、先頭列の値を取得します。また、結果が複数行であった場合は、先頭の1行が対象行となります。

$q = '`SELECT `entry_title` FROM `acms_entry` WHERE `entry_id` = 1';
$one = $DB->query($q, 'one');

var_dump($row);
/*
dumpの結果 

string "サンプルレコード"
*/

fetch - 結果を1行ずつ取得

結果を1行ずつ取得できるように、クエリーの結果をDBインスタンス内で保持します。保持された結果は、fetchメソッドで1行ずつ取得します。

fetchメソッドの返り値はrowモードと同じ挙動を示しますが、取得すべき結果が無くなった場合は、falseを返します。

$q = '`SELECT * FROM `acms_entry` LIMIT 0, 10';
$DB->query($q, 'fetch');

/**
 * fetch
 * @param string $query
 * @return array $row
 */
while ( $row = $DB->fetch($q) ) {
   echo $row['entry_title']."\r\n";
}

/*
echo の結果

サンプルレコード
サンプルレコード2
サンプルレコード3
...
..
.

*/

exec - クエリーの成否をbooleanで取得

クエリーの成否のみをbooleanで返します。INSERT、UPDATE、DELETEなどの発行時に使用します。

$q = 'INSERT INTO acms_entry (col1, col2, col3....) VALUES(val1, val2, val3...);'
$res = $DB->query($q, 'exec');

if ( $res == true ) {
   // success
} else {
   // fail
}