読者です 読者をやめる 読者になる 読者になる

WebアプリケーションのMVCを一人でぶっ続けで編集していると段々訳がわからなくなってきますよ。
HTMLとCSSJavascriptSmartyPHPを横断してコーディングしていると、さすがにいいかげんにしてくれと思うわん‥‥

特に今回はプレゼンテーション部分に使い回しじゃない新規機能の追加なんですが、JavascriptでのUI実装はしんどい。マジで。


モデル部分は純粋・単純にクラスの塊なので素直に動くのですが、コントローラ部分はWebの遷移やらpostされるデータ・Javasctiptで構築される動的コントロールとか、色々と本質的でない部分を扱うので、馴れないとワカラン。
特に、今回のシステムではモデルの9割方はワシが書いたけど、コントローラ部分は簡単なアーキテクチャだけ作って後はお任せだったので、後からコード見るとどこ弄れば良いのかイメージしにくいわん。


これがビュー部分になると、渡されてきた変数の塊を表示するだけなのである意味一番素直なんですが。
幾つかBLに絡む部分もありますが、smartyPHPのクラスをプラグインとして簡単に呼び出せるので、モデル側でプラグインを作っておけばコントローラ通さずにビューから直接BLを使えるしね。


例えばこんな感じ。

address_list.tpl

<p>zip: {$item['address_zip']|zip_format|escape}</p>
<br>
<p>zip-nonhyphen: {$item['address_zip']|zip_format:format="unformat"|escape}</p>


modifier.zip_format.php

<?php
function smarty_modifier_zip_format($value, $format = 'format')
{
    switch ($format) {
        case 'format':
            return AddressHelper::FormatZip($value);
            break;
        case 'unformat':
            return AddressHelper::UnFormatZip($value);
            break;
        default:
            return $value;
            break;
   }
}


AddressHelper.php

<?php
class AddressHelper
{
    /**
     * ハイフンで書式化された郵便番号を取得
     *
     * @param unknown_type $zip
     * @return string 郵便番号として使える文字列
     */
    public static function FormatZip($zip)
    {
        if (self::trimZip($zip) == true) {
            return sprintf('%1$03d-%2$04d', (int)($zip / 10000),  ($zip % 10000));
        } else {
            return $zip;
        }
    }

    /**
     * ハイフンなしで7桁書式化された郵便番号を取得
     *
     * @param unknown_type $zip
     * @return string 郵便番号として使える文字列
     */
    public static function UnFormatZip($zip)
    {
        if (self::trimZip($zip) == true) {
            return sprintf('%1$07d', $zip);
        } else {
            return $zip;
        }
    }

    /**
     * 郵便番号解析
     *
     * @param unknown_type &$zip 解析する郵便番号
     *   return = trueの時はinteger値で置き換えられる。 falseの場合はそのまま
     * @return 解析結果
     *   true : 郵便番号として有効な整数値に変換した
     *   false : $zipが郵便番号に変換できない値
     */
    private static function trimZip(&$zip)
    {
        $maxcol = pow(10, 7); // 郵便番号の最大値+1
        $tmpZip = $zip;
        if(is_int($tmpZip) == true) {
            return ($tmpZip > 0) && ($tmpZip < $maxcol);
        } else {
            $tmpZip = str_replace('-', '', $tmpZip);
            if (is_numeric($tmpZip)) && ((int)($tmpZip) < $maxcol) && ((int)($tmpZip) > 0) {
                $zip = (int)($tmpZip);
                return true;
            } else {
                return false;
            }
        }
    }
}

AddressHelperはモデル側に属するロジックですが、それをコントローラ介さず直接ビューから呼べるぞいと。
同じように、マスター一覧を取得するロジックをビューから直接呼ぶような事も可能。まぁ、今回は設計思想的にDaoに属するデータの入出力はコントローラ経由で行っているので、あんまり大々的なプラグインは作り込んではいないけどね。