テンプレートエンジン - 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
}