カスタムフォーム設計とコードジェネレータ機能

カスタムフォームやコードジェネレータ機能は、一定のルールに基づいてコードを生成するものです。このプロセスは比較的単純で、テンプレートや定義された文字列を作成し、それらを処理することで実現されます。

テンプレート設計のルール => ユーザーが選択できるルールのインターフェース => ルール内容の置換 => 固定テンプレートまたは文字列への変換 => プレビューとルールの確認 => 実際のコード生成

実際のコード生成には以下の要素が含まれます:

  1. 対応するデータベースとテーブルの生成
  2. 論理コード
  3. フロントエンドインターフェース(ルールに基づいて生成)

以下にデモを示します。これは参考用であり、各プロジェクトの要件やフレームワークが異なるため、実際のコードテンプレートやフロントエンドテンプレートは異なります。

ページコード生成

// フィールド情報に基づいて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='製品タイプフィールド管理器'

デモ画像

タグ: PHP ThinkPHP HTML SQL カスタムフォーム

7月31日 04:52 投稿