Ethnaをmojavi(symfony)風ディレクトリ構成にする

| | コメント(0) |


Ethnaはこんな感じ。
[action]        app/action/User/Group/List.php
[view]          app/view/User/Group/List.php
[template]      template/user/group/list.tpl
templateがひとつのディレクトリにまとまっているので、デザイナーさんがいじったりする場合は、この以下だけいじってねって言えるので便利かも。

だけど全体的にファイルの階層が深くてばらばらなところにあるので相互に編集するとき大変。

なので、mojavi風にmodule毎にaction, view, templateディレクトリを作ってその中に放り込むようにする。

これだと階層は浅くなるけど1つのディレクトリに大量のファイルができることになるかも。
その辺はトレードオフ。じんせいっていろいろタイヘン!

変更後はこんな感じ。
[action]        app/modules/User/actions/GroupList.php
[template]                      /templates/GroupList.php
[view]                          /views/GroupList.php
ethnaにはmoduleの概念がないんだけど、user_group_list だったら最初の user の部分をmoduleと見なす事に。 指定がない場合は default_ をむりやりつけちゃうze

app/APPID_Controller.php
<?php

class APPID_Controller extends Ethna_Controller
{
    // (snip)

    /* @override */
    function getDefaultActionPath($action_name)
    {
        $r = $this->_getPath($action_name, "actions");
        $this->logger->log(LOG_DEBUG, "default action path [%s]", $r);
        return $r;
    }

    /* @override */
    function getDefaultViewPath($forward_name)
    {
        $r = $this->_getPath($forward_name, "views");
        $this->logger->log(LOG_DEBUG, "default view path [%s]", $r);
        return $r;
    }

    /* @override */
    function getDefaultForwardPath($forward_name)
    {
        $r = $this->_getPath($forward_name, "templates");
        return $r;
    }

    /* @param string $type (actions|views|templates) */
    function _getPath($name, $type)
    {
        if (strpos($name, '_') === false) { // _ がない場合は default_ を付与
            $name = "default_{$name}";
        }
        $r = preg_replace('/_(.)/e', "'/$type/' . strtoupper('\$1')",ucfirst($name), 1);
        $r = preg_replace('/_(.)/e', "strtoupper('\$1')", $r) . '.' . $this->getExt('php');
        return $r;
    }
}
こんなんで動くかな!
あー、これだとtemplateの拡張子がphpになる。

[2007/02/10追記]
app/APPID_Controller.php のディレクトリを以下のようにしないとだめですね。。
   var $directory = array(
        'action'        => 'app/modules',
         'view'          => 'app/modules',
         'template'   => 'app/modules',
    );

カテゴリ

,
 

コメントする