アプリケーションの多くのフォーム定義はデータベース テーブルと密接。例えば
スケルトンで生成する他に、今回は下記のように動的にフォーム定義を生成する。
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 に
個々のフォーム定義を変更したい場合は、手動で定義を記述すれば優先する。
動作環境は、
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
使用する列名は全テーブルでユニークであることが前提。
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
使用する列名は全テーブルでユニークであることが前提。