« ethnaでformの配列を個別にチェックしたい | メイン | ethnaのフォーム定義をDBから取得する その2 »

ethna

ethnaのフォーム定義をDBから取得する その1

アプリケーションの多くのフォーム定義はデータベース テーブルと密接。例えば
CREATE TABLE tableA(
 acd     INT
,aid     VARCHAR(10)
,acreate DATETIME
,amemo   TEXT
)ENGINE = INNODB
CHARACTER SET utf8 COLLATE utf8_general_ci;
なら ↓
'acd'    => array(
    'name'     => 'acd',
    'form_type'=> FORM_TYPE_TEXT,
    'type'     => VAR_TYPE_INT,
    'filter'   => 'ltrim,rtrim,ntrim',
),
'aid'    => array(
    'name'     => 'aid',
    'form_type'=> FORM_TYPE_TEXT,
    'type'     => VAR_TYPE_STRING,
    'max'      => 10,
    'filter'   => 'ltrim,rtrim,ntrim',
),
'acreate'=> array(
    'name'     => 'acreate',
    'form_type'=> FORM_TYPE_TEXT,
    'type'     => VAR_TYPE_DATETIME,
    'filter'   => 'ltrim,rtrim,ntrim',
),
'amemo'  => array(
    'name'     => 'amemo',
    'form_type'=> FORM_TYPE_TEXTAREA,
    'type'     => VAR_TYPE_STRING,
    'filter'   => 'ltrim,rtrim,ntrim',
),
という具合に大量のフォーム定義をテーブルのメタ情報から取得する。
スケルトンで生成する他に、今回は下記のように動的にフォーム定義を生成する。
class APPID_ActionForm extends Ethna_ActionForm に
var $tables = array( 'tableA','tableB','tableC', );
を追加して、フォーム定義を動的に生成したいテーブルを登録する。さらに
function _setFormTemplate($form_template){
    $map = array(  ///    ここでマッピングを調整
        'form_type'=> array(
            'int'     => FORM_TYPE_TEXT,
            'string'  => FORM_TYPE_TEXT,
            'datetime'=> FORM_TYPE_TEXT,
            'boolean' => FORM_TYPE_TEXT,
            'blob'    => FORM_TYPE_TEXTAREA,
        ),
        'type'     => array(
            'int'     => VAR_TYPE_INT,
            'string'  => VAR_TYPE_STRING,
            'datetime'=> VAR_TYPE_DATETIME,
            'boolean' => VAR_TYPE_STRING,
            'blob'    => VAR_TYPE_STRING,
        ),
        'max'      => array(
            'string'  => true,
        ),
    );
    $ethnadb =& $this->backend->getDB();
    foreach( $this->tables as $vv ){
        $columns =& $ethnadb->getMetaData( $vv );
        if( is_array( $columns ) === false ){    ///    異常系    Ethna::isError検出できない為オリジナルと同じ判定
            $this->backend->log( LOG_WARNING, "取得失敗 getMetaData({$vv})" );
            continue;
        }
        foreach( $columns as $k => $v ){
            if( ! array_key_exists( $v['name'], $form_template ) ){
                $form_template[$v['name']] = array();
            }
            if( ! array_key_exists( 'type', $form_template[$v['name']] ) ){
                if( array_key_exists( $v['type'], $map['type'] ) ){
                    $form_template[$v['name']]['type'] = $map['type'][$v['type']];
                }
            }
            if( ! array_key_exists( 'form_type', $form_template[$v['name']] ) ){
                $form_template[$v['name']]['form_type'] = $map['form_type'][$v['type']];
            }
            if( array_key_exists( $v['type'], $map['max'] ) ){
                if( ! array_key_exists( 'max', $form_template[$v['name']] ) ){
                    $form_template[$v['name']]['max'] = $v['len'];
                }
            }
            if( ! array_key_exists( 'filter', $form_template[$v['name']] ) ){
                $form_template[$v['name']]['filter'] = 'ltrim,rtrim,ntrim';
            }
            if( ! array_key_exists( 'name', $form_template[$v['name']] ) ){
                $form_template[$v['name']]['name'] = $v['name'];
            }
        }
    }
    return parent::_setFormTemplate($form_template);
}
これで、フォーム定義を全く記述しなくても $form_template にテーブルの全列が動的に定義される。
個々のフォーム定義を変更したい場合は、手動で定義を記述すれば優先する。

動作環境は、
Vine Linux 4.2 (Lynch Bages)
Ethna-2.3.7、Ethna-2.5.0-preview3、Ethna-2.5.0-preview5
MySQL Server version: 5.0.27-standard

CentOS release 5.3 (Final)
Ethna-2.5.0-preview3
MySQL Server version: 5.0.27-standard

使用する列名は全テーブルでユニークであることが前提。

トラックバック

このエントリーのトラックバックURL:
https://www.remix.asia/cgi/mt/mt-tb.cgi/6593

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)