« ethnaのフォーム定義をDBから取得する その2 | メイン | ethna のEthna_DB_PEAR:getMetaData()でNOTICE »

ethna

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

前回のままではテーブルの列の数だけSQLが発行されてしまうので
の方法で連想配列からルックアップできるように改善。
class APPID_ColumnsManager extends Ethna_AppManager に
getResultArray() を作成しておき、
class APPID_ActionForm extends Ethna_ActionForm
の _setFormTemplate を次のように改造
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,
        ),
    );
    $manager =& $this->backend->getManager( 'columns' ); /// ★
    $resultArray =& $manager->getResultArray(); /// ★
    $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']] ) ){
///             $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' );
///         }
///    ↓
            if( ! Ethna::isError( $resultArray ) ){
                if( ! array_key_exists( 'name', $form_template[$v['name']] ) ){
                    if( array_key_exists( $v['name'], $resultArray[2] ) ){
                        $form_template[$v['name']]['name'] = $resultArray[2][$v['name']]['column_comment'];
                    }
                }
            }
///
//////////////////////////////
        }
    }
    return parent::_setFormTemplate($form_template);
}
完成。コメント変更は
ALTER TABLE tablename CHANGE fieldname fieldname INT COMMENT 'コード';
カラムのコメントは、255文字の長さまで。
コメントは SHOW CREATE TABLE と SHOW FULL COLUMNS ステートメントによって表示。
SHOW FULL COLUMNS FROM tablename;
SHOW COLUMNS FROM areas;
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='tablename';
2009/09/17 補足を追記

トラックバック

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

コメントを投稿

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