a-blog cms 勉強会 in 名古屋 2010-09-08 の資料
Posted: Updated:
a-blog cms の拡張に関してつらつら
a-blog cms 勉強会 in 名古屋 2010/09 : ATND 用の資料エントリーです。
a-blog cmsの拡張は、HTMLとPHPの完全な分離と、単機能の容易な実装に特化して設計されています。これは、制作メンバー間の分業を意識した構造であると共に、HTMLに対してモジュール ( PHP ) を通して、高速で機能を提供できる構造です。
バックエンドエンジニア (ぺちぱー) にとっては... : 拡張可能な部分が、GETモジュールとPOSTモジュールの2種類しか無いことが特徴です。"出力"または"入力"というシンプルな考え方から実装に取りかかれます。
フロントエンドエンジニア (こーだー) にとっては... : 基本的にモジュールは単機能であり、どこに記述しても同じように動作するため、一度モジュールが開発されればテンプレート側だけでモジュールを再利用できます。
a-blog cmsにおける拡張機能は、本体システムがWebサイト用途としてCMSという基本ができあがっている為、想定される拡張は小規模かつ単機能であることがほとんどです。大規模な改修よりも、要件の変化にフレキシブルに対応できることがメリットです。(そもそもプロプライエタリソフトウェアなので、大規模な改修は始めから選択肢にできません)
a-blog cmsは厳格なMVCモデルに基づいたアーキテクチャではありません。その代わりGETモジュールとPOSTモジュールの中では、最低限の出力と入力という規約さえ遵守すれば、その他の制限はほとんど無いため、ピュアなPHPに近い形で実装できる柔軟性と独立性が保証されます。
そんな感じで勉強資料などがつづく。
勉強資料
キホンのキ
モジュールの書き方
テンプレート操作
データベース操作
付録
- GETモジュールから表示ページがもつIDを参照する
- a-blog cmsのモジュールの書き方 その1 | kazumich.log
- a-blog cmsのモジュールの書き方 その2 | kazumich.log
- a-blog cmsのモジュールの書き方 その3 | kazumich.log
- 外部CSSを勝手に結合してMinify!
- archivesの画像をData URIに変換
- 公開と同時につぶやくよ(TwitterAPI叩いてみた)
ここまでで出来るようになった(はず)のこと
上記の勉強資料 ( 付録を除く ) に目を通せば、大体の基本操作はできるようになりました。
- GET・POSTモジュールの作成
- テンプレートの操作
- DBからのデータ取得
疑似Entry_Listを作ってみよう
<?php
require_once ACMS_LIB_DIR.'GET.php';
class ACMS_GET_FakeList extends ACMS_GET
{
function get()
{
$Tpl = new Template($this->tpl, new ACMS_Corrector());
$DB = DB::singleton(dsn());
$SQL = SQL::newSelect('entry');
$SQL->addWhereOpr('entry_status', 'open');
// 各定数には現在表示中のページのentry_id, category_id, blog_idが格納されています
if ( !!EID ) $SQL->addWhereOpr('entry_id', EID);
if ( !!CID ) $SQL->addWhereOpr('entry_category_id', CID);
if ( !!BID ) $SQL->addWhereOpr('entry_blog_id', BID);
$SQL->setLimit(10);
$all = $DB->query($SQL->get(dsn()), 'all');
foreach ( $all as $row ) {
$title = $row['entry_title'];
$eid = $row['entry_id'];
$cid = $row['entry_category_id'];
$bid = $row['entry_blog_id'];
// acmsLink関数は、各種idを与えると、そのidで特定できるURLを返します
$vars = array(
'title' => $title,
'eid' => $eid,
'cid' => $cid,
'bid' => $bid,
'url' => acmsLink(array(
'eid'=>$eid,
'cid'=>$cid,
'bid'=>$bid
))
);
// ACMS_RAMは多数のスタティックメソッドを備え、与えたidに応じてレコードのデータを返します
$vars += array(
'categoryName' => ACMS_RAM::categoryName($cid),
'categoryCode' => ACMS_RAM::categoryCode($cid),
'categoryUrl' => acmsLink(array('cid' => $cid, 'bid' => $bid)),
'blogName' => ACMS_RAM::blogName($bid),
'blogCode' => ACMS_RAM::blogCode($bid),
'blogUrl' => acmsLink(array('bid' => $bid)),
);
$Tpl->add('entry:loop', $vars);
}
return $Tpl->get();
}
}
最後の加筆
ふたを開けてみれば、実習とかは特になく必死に設計やら独自性を紹介していました。プログラムについて、社外の人としゃべったの、実は初めてです。ガラパゴス育ちなもんで。
自分にとっては、入社した時点でa-blog cmsは既にソコにある存在だったので、テンプレートエンジンやSQLヘルパーの使い心地に疑問すら持っていませんでした。ところが、内部構造をひとに説明することになりそうということで、他のWebフレームワークのアーキテクチャを調べてみたら、a-blog cmsが尖りまくっていることが判明。
初めて「なぜこの構造なのか」というシステムの原初の意図と向き合う、良い機会になりました。CMSという"ウェブサイト"向けな規模感の中で、この設計になっていることは、将来的な機能拡張を含めて、正真正銘Webサイトを作るためのCMSとして最適化された結果だと実感した次第。
無謬しない程度に感動して、ガラパゴスしない程度の他のフレームワークも触ってみようと思いました。〆