カスタムフォームやコードジェネレータ機能は、一定のルールに基づいてコードを生成するものです。このプロセスは比較的単純で、テンプレートや定義された文字列を作成し、それらを処理することで実現されます。
テンプレート設計のルール => ユーザーが選択できるルールのインターフェース => ルール内容の置換 => 固定テンプレートまたは文字列への変換 => プレビューとルールの確認 => 実際のコード生成
実際のコード生成には以下の要素が含まれます:
- 対応するデータベースとテーブルの生成
- 論理コード
- フロントエンドインターフェース(ルールに基づいて生成)
以下にデモを示します。これは参考用であり、各プロジェクトの要件やフレームワークが異なるため、実際のコードテンプレートやフロントエンドテンプレートは異なります。
ページコード生成
// フィールド情報に基づいてHTMLを生成
function generateHtmlByField($fieldInfo, $data, $name = 'customer') {
$identifier = $fieldInfo['identifier'];
$formRule = stripslashes($fieldInfo['form_rule']);
$formStyle = $fieldInfo['form_style'] ? ' style="'.stripslashes($fieldInfo['form_style']).'"' : '';
switch ($fieldInfo['form_type']) {
case 'text':
$html = '<input type="text" name="'.$name.'['.$identifier.']" value="'.$data[$identifier].'"' . $formStyle . $formRule . ' />';
break;
case 'password':
$html = '<input type="password" name="'.$name.'['.$identifier.']" value="'.$data[$identifier].'"' . $formStyle . $formRule . ' />';
break;
case 'radio':
$options = $fieldInfo['const_category'] != 'custom' ? getConstListArray($fieldInfo['const_category']) : unserialize($fieldInfo['ext']);
foreach($options as $key => $value) {
$checked = (isset($data[$identifier]) && $key == $data[$identifier]) ? ' checked="checked"' : '';
$html .= '<input type="radio" name="'.$name.'['.$identifier.']" value="'.$key.'" '.$formStyle.$formRule.$checked.' />' . $value;
}
break;
case 'checkbox':
$options = $fieldInfo['const_category'] != 'custom' ? getConstListArray($fieldInfo['const_category']) : unserialize($fieldInfo['ext']);
$html .= '<input type="hidden" name="'.$name.'[checkbox][]" value="'.$name.'['.$identifier.']" />';
foreach($options as $key => $value) {
$checkedValues = explode("|", $data[$identifier]);
$checked = (isset($data[$identifier]) && in_array($key, $checkedValues)) ? ' checked="checked"' : '';
$html .= '<label style="float:left; margin-left:5px;"><input type="checkbox" name="'.$name.'['.$identifier.'][]" value="'.$key.'" '.$formStyle.$formRule.$checked.' />' . $value . '</label>';
}
break;
case 'select':
$options = $fieldInfo['const_category'] != 'custom' ? getConstListArray($fieldInfo['const_category']) : unserialize($fieldInfo['ext']);
$html = '<select name="'.$name.'['.$identifier.']" '.$formStyle . $formRule.'><option value="">選択してください</option>';
foreach($options as $key => $value) {
$selected = (isset($data[$identifier]) && $key == $data[$identifier]) ? ' selected="selected"' : '';
$html .= '<option value="'.$key.'"'.$selected.'>'.$value.'</option>';
}
$html .= '</select>';
break;
case 'textarea':
$html = '<textarea name="'.$name.'['.$identifier.']"'.$formStyle.$formRule.'>'.$data[$identifier].'</textarea>';
break;
case 'address':
$html = '<select id="' . $name . '_' . $identifier . '_province" name="' . $name . '[' . $identifier . '_province]"' . ' class="span2"' . $formRule . '></select>省';
$html .= '<select id="' . $name . '_' . $identifier . '_city" class="span2" name="' . $name . '[' . $identifier . '_city]" ' . $formRule . ' ></select>市';
$html .= '<select id="' . $name . '_' . $identifier . '_county" class="span2" name="' . $name . '[' . $identifier . '_address_county]" ' . $formRule . '></select>区/県';
$html .= '<input type="text" name="' . $name . '[' . $identifier . ']" value="' . $data[$identifier] . '" id="' . $identifier . '" ' . $formStyle . $formRule . ' />';
$html .= '<script>addressInit("'.$name.'_'.$identifier.'_province", "'.$name.'_'.$identifier.'_city", "'.$name.'_'.$identifier.'_county","'.$data[$identifier.'_province'].'","'.$data[$identifier.'_city'].'","'.$data[$identifier.'_county'].'");</script>';
break;
case 'datetime':
$html .= '<input type="hidden" name="'.$name.'[datetime][]" value="'.$name.'['.$identifier.']" />';
$html .= '<input type="text" name="'.$name.'['.$identifier.']" id="'.$identifier.'" value="'.($data[$identifier] ? date('Y-m-d', $data[$identifier]) : '').'" onFocus="WdatePicker({dateFmt:\'yyyy-MM-dd\'})"'.$formStyle.$formRule.' />';
break;
case 'number':
$html = '<input type="number" name="'.$name.'['.$identifier.']" value="'.($data[$identifier] ? $data[$identifier] : '').'"'.$formStyle . $formRule . ' />';
break;
case 'hidden':
$html = '<input type="hidden" name="'.$name.'['.$identifier.']" value="'.($data[$identifier] ? $data[$identifier] : '').'"'.$formStyle . $formRule . ' />';
break;
default:
return '選択したフォームタイプが間違っています!';
break;
}
$html .= $fieldInfo['note'] . ($fieldInfo['form_script'] ? '<script>'.stripslashes($fieldInfo['form_script']).'</script>' : '');
return $html;
}
データベースフィールドの作成
$addition = $_POST['addition']; // テーブル名
$identifier = $_POST['identifier']; // フィールド名
// フィールドタイプと長さ
$fieldType = $_POST['field_type'];
$fieldLength = $_POST['field_length'];
$defaultValue = $_POST['default_value'];
$formType = $_POST['form_type'];
$note = $_POST['note'];
$_POST['form_rule'] = addslashes($_POST['form_rule']);
$_POST['form_style'] = addslashes($_POST['form_style']);
$_POST['form_script'] = addslashes($_POST['form_script']);
$_POST['ext'] = serialize(str_to_arr($_POST['ext']));
if(!ereg("^[0-9a-zA-Z\_]*$", $identifier)) {
alert('error', "フィールド識別子の形式が正しくありません", U('add'));
}
if (empty($defaultValue)) {
$dd = $fieldLength > 0 ? $fieldType . '(' . $fieldLength . ') not null ' : null;
} else {
$dd = $fieldLength > 0 ? $fieldType . '(' . $fieldLength . ') not null default ' . $defaultValue : null;
}
if ($formType == 'address') {
$sql = "alter table " . C('DB_PREFIX') . "$addition add $identifier $dd COMMENT '" . $_POST['title'] . "',add " . $identifier . "_province VARCHAR(10) NULL AFTER $identifier,add " . $identifier . "_city VARCHAR(40) NULL AFTER " . $identifier . "_province,add " . $identifier . "_county VARCHAR(30) NULL AFTER " . $identifier . "_city";
} else {
$sql = "alter table " . C('DB_PREFIX') . "$addition add $identifier $dd COMMENT '" . $_POST['title'] . "'";
}
$fieldsModel = M('fields');
$fieldsModel->startTrans();
if ($fieldsModel->add($_POST) && M()->execute($sql) === 0) { // データの挿入とフィールドの作成
$fieldsModel->commit();
alert('success', "作成成功", U('index'));
} else {
$fieldsModel->rollback();
myLog($sql);
alert('error', "作成失敗", U('index'));
}
このコードには問題があります。時間があれば修正が必要です。複雑なSQL文はphpMyAdminを使用して編集することをお勧めします。
マッピングテーブルと実際のフィールドテーブル
例えば、特定のフィールドのルールを追加する場合、データベースの user_name に対応するフォームの user_name を使用します。論理コードでは、手動で対応させないようにしましょう。
ThinkPHPのデータベース挿入処理
主データベーステーブル構造と個々の商品またはページの結果はほぼ同じです。製品IDまたはページIDに基づきます。
主テーブル<br></br>CREATE TABLE `v1_fields` (
`fields_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT 'フィールドID、自動増分',
`title` varchar(248) NOT NULL COMMENT 'フィールド名',
`identifier` varchar(64) NOT NULL COMMENT 'フィールド識別子',
`field_type` varchar(248) DEFAULT NULL COMMENT 'フィールドストレージタイプ',
`field_length` int(8) DEFAULT NULL COMMENT 'フィールド長',
`form_rule` varchar(255) DEFAULT NULL COMMENT 'フィールド検証式',
`note` varchar(248) DEFAULT NULL COMMENT 'フィールド内容メモ',
`form_type` varchar(128) DEFAULT NULL COMMENT 'フォームタイプ',
`form_style` varchar(248) DEFAULT NULL COMMENT 'フォームCSS',
`form_script` text COMMENT 'フォームスクリプト',
`format` varchar(128) DEFAULT NULL COMMENT 'フォーマット方式',
`default_value` varchar(128) DEFAULT NULL COMMENT 'デフォルト値',
`sort` tinyint(3) unsigned NOT NULL DEFAULT '255' COMMENT 'ソート順',
`const_category` varchar(128) DEFAULT NULL COMMENT '定数タイプ名',
`ext` text COMMENT '拡張内容',
`addition` varchar(32) DEFAULT NULL COMMENT '所属テーブル名',
`create_time` int(11) DEFAULT NULL COMMENT '作成日時',
PRIMARY KEY (`fields_id`)
) ENGINE=InnoDB AUTO_INCREMENT=854 DEFAULT CHARSET=utf8 COMMENT='フィールド管理器'
CREATE TABLE `v1_product_category_fields` (
`product_category_fields_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT 'フィールドID、自動増分',
`product_category_id` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT '製品タイプID',
`title` varchar(128) NOT NULL COMMENT 'フィールド名',
`identifier` varchar(64) NOT NULL COMMENT 'フィールド識別子',
`field_type` varchar(248) DEFAULT NULL COMMENT 'フィールドストレージタイプ',
`form_rule` varchar(255) DEFAULT NULL COMMENT 'フィールド検証式',
`field_length` int(8) DEFAULT NULL COMMENT 'フィールド長',
`note` varchar(248) DEFAULT NULL COMMENT 'フィールド内容メモ',
`form_type` varchar(128) DEFAULT NULL COMMENT 'フォームタイプ',
`form_style` varchar(248) DEFAULT NULL COMMENT 'フォームCSS',
`form_string` varchar(248) DEFAULT NULL COMMENT 'フォーム表示側',
`form_script` text COMMENT 'フォームスクリプト',
`format` varchar(128) DEFAULT NULL COMMENT 'フォーマット方式',
`default_value` varchar(248) DEFAULT NULL COMMENT 'デフォルト値',
`sort` tinyint(3) unsigned NOT NULL DEFAULT '255' COMMENT 'ソート順',
`const_category` varchar(64) DEFAULT NULL COMMENT '定数タイプ名',
`ext` text COMMENT '拡張内容',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1:有効 2:無効',
`addition` varchar(50) DEFAULT NULL COMMENT '所属付加テーブル名',
PRIMARY KEY (`product_category_fields_id`),
KEY `product_category_id` (`product_category_id`)
) ENGINE=InnoDB AUTO_INCREMENT=611 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='製品タイプフィールド管理器'
デモ画像