a-blog cms 勉強会 in 名古屋 2010-09-08 の資料
Posted: Updated:
a-blog cms の拡張に関してつらつら

ioncube encoded...
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として最適化された結果だと実感した次第。
無謬しない程度に感動して、ガラパゴスしない程度の他のフレームワークも触ってみようと思いました。〆