« ethnaのフォーム定義をDBから取得する その1 | メイン | ethnaのフォーム定義をDBから取得する その3 »

ethna

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

前回はテーブルの列名をフォーム名とフォームの表示名にセット。
テーブルの列名には仕様書には日本語表記があるはずで、本当はこれをフォームの表示名にしたい。
データベース テーブル 列のコメントを利用するため、MySQL 5 に依存する。
まずは、テーブルの各列のコメントに表示名を設定。
CREATE TABLE tableA(
 acd     INT         COMMENT '番号'
,aid     VARCHAR(10) COMMENT 'ID'
,acreate DATETIME    COMMENT '作成日時'
,amemo   TEXT        COMMENT 'メモ'
)ENGINE = INNODB
CHARACTER SET utf8 COLLATE utf8_general_ci;
このコメント(表示名)を ethna の Ethna_AppObject で使えるようにするには次のとおり。
VIEW を利用するため、MySQL 5 に依存する。

DROP VIEW IF EXISTS `columns`;
CREATE VIEW columns AS SELECT table_name,column_name,column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='databasename';

ethna コマンドで
ethna add-app-object columns
しておき、前回のコードをさらに改造
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'];
///         }
            if( ! array_key_exists( 'name', $form_template[$v['name']] ) ){
                $o =& $this->backend->getObject( 'columns'
                ,    array( 'table_name', 'column_name' )
                ,    array( $vv, $v['name'] )
                );
                if( Ethna::isError( $o ) ){ /// 異常系
                    $this->backend->log( LOG_ERR, 'データベース障害' );
                    continue;
                }
                if( ! $o->isValid() ){ /// 該当なし
                    continue;
                }
                $form_template[$v['name']]['name'] = $o->get( 'column_comment' );
            }
        }
    }
    return parent::_setFormTemplate($form_template);
}
とりあえず、これで
'acd'    => array(
    'name'     => '番号',
    'form_type'=> FORM_TYPE_TEXT,
    'type'     => VAR_TYPE_INT,
    'filter'   => 'ltrim,rtrim,ntrim',
),
'aid'    => array(
    'name'     => 'ID',
    'form_type'=> FORM_TYPE_TEXT,
    'type'     => VAR_TYPE_STRING,
    'max'      => 10,
    'filter'   => 'ltrim,rtrim,ntrim',
),
'acreate'=> array(
    'name'     => '作成日時',
    'form_type'=> FORM_TYPE_TEXT,
    'type'     => VAR_TYPE_DATETIME,
    'filter'   => 'ltrim,rtrim,ntrim',
),
'amemo'  => array(
    'name'     => 'メモ',
    'form_type'=> FORM_TYPE_TEXTAREA,
    'type'     => VAR_TYPE_STRING,
    'filter'   => 'ltrim,rtrim,ntrim',
),
が実行時に機能する。
続く

トラックバック

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

コメントを投稿

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