a-blog cms 勉強会 in 名古屋 2010-09-08 の資料

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・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として最適化された結果だと実感した次第。

無謬しない程度に感動して、ガラパゴスしない程度の他のフレームワークも触ってみようと思いました。〆