自定义表单设计,即通用代码脚手架功能

2017年1月4日22:16:57

这个功能是我公司做的一个功能叫做自定表单,和流程,虽然我不是很懂流程,但是基础的自定义表单设计我是参与的,所以积累一点经验,

其实自定表单,或者代码脚手架功能就是按照一定规则来生产代码,其实也很简单,就是制作模板或者一些定义的字符串,然后处理这些

模板或者字符串,

设计模板的规则=> 可供用户选择的规则界面=>替换规则内容 => 处理成固定模板或者字符串=> 预览查看是否符合规则 =>生产实际代码

生产实际代码 包括几块 

1,生成对应的数据库和表

2,逻辑代码

3,前段界面(根据规则生产的)

然后就可以一段一段的写成你需要的工具

以下是demo ,仅供参考,因为每个项目需要的规则不同,实际的项目框架不同,所以实际的代码模板或者前段模板也不一样,设计

思路会不一样,所以你实际项目的代码脚手架功能代码,需要你自己编写,

页面代码生成

//根据字段信息创建,吧对应的表单信息html创建出来 $edit_valuey用于编辑页面确定选中的值
function getHtmlByField($field_info, $vo, $name = 'customer') {
    $identifier = $field_info['identifier'];
    $form_rule = stripslashes($field_info['form_rule']);
    $form_style = $field_info['form_style'] ? ' style="'.stripslashes($field_info['form_style']).'"' : '';
    switch ($field_info['form_type']) {
        case 'text':
            $html = '<input type="text" name="'.$name.'['.$identifier.']" value="'.$vo[$identifier].'"' . $form_style . $form_rule . ' />';
            break;
        case 'password':
            $html = '<input type="password" name="'.$name.'['.$identifier.']" value="'.$vo[$identifier].'"' . $form_style . $form_rule . ' />';
            break;
        case 'radio':
            $s_array = $field_info['const_category'] != 'custom' ? getConstListArray($field_info['const_category']) : unserialize($field_info['ext']);
            foreach($s_array as $key=>$val) {
                $checked = (isset($vo[$identifier]) && $key == $vo[$identifier]) ? ' checked ="checked"' : '';
                $html .= '<input type="radio" name="'.$name.'['.$identifier.']" value="'.$key.'" '.$form_style.$form_rule.$checked.' />' . $val;
            }
            break;
        case 'checkbox':
            $s_array = $field_info['const_category'] != 'custom' ? getConstListArray($field_info['const_category']) : unserialize($field_info['ext']);
            $html .= '<input type="hidden" name="'.$name.'[checkbox][]" value="'.$name.'['.$identifier.']" />';
            foreach($s_array as $key=>$val) {
                $checked_str = explode("|", $vo[$identifier]);
                $checked = (isset($vo[$identifier]) && in_array($key, $checked_str)) ? ' checked ="checked"' : '';
                $html .= '<label style="float:left; margin-left:5px;"><input type="checkbox" name="'.$name.'['.$identifier.'][]" value="'.$key.'" '.$form_style.$form_rule.$checked.' />' . $val . '</label>';
            }
            break;
        case 'select':
            $s_array = $field_info['const_category'] != 'custom' ? getConstListArray($field_info['const_category']) : unserialize($field_info['ext']);
            $html = '<select name="'.$name.'['.$identifier.']" '.$form_style . $form_rule.'><option value="">请选择</option>';
            foreach($s_array as $key=>$val) {
                $selected = (isset($vo[$identifier]) && $key == $vo[$identifier]) ? ' selected="selected"' : '';
                $html .= '<option value="'.$key.'"'.$selected.'>'.$val.'</option>';
            }
            $html .= '</select>';
            break;
        case 'textarea':
            $html = '<textarea name="'.$name.'['.$identifier.']"'.$form_style.$form_rule.'>'.$vo[$identifier].'</textarea>';
            break;
        case 'address':
            $html = '<select id="' . $name . '_' . $identifier . '_province" name="' . $name . '[' . $identifier . '_province]"' . ' class="span2"' . $form_rule . '></select>省';
            $html .= '<select id="' . $name . '_' . $identifier . '_city" class="span2" name="' . $name . '[' . $identifier . '_city]" ' . $form_rule . ' ></select>市';
            $html .= '<select id="' . $name . '_' . $identifier . '_county" class="span2" name="' . $name . '[' . $identifier . '_address_county]" ' . $form_rule . '></select>区/县';
            $html .= '<input type="text" name="' . $name . '[' . $identifier . ']" value="' . $vo[$identifier] . '" id="' . $identifier . '" ' . $form_style . $form_rule . ' />';
            $html .= '<script>addressInit("'.$name.'_'.$identifier.'_province", "'.$name.'_'.$identifier.'_city", "'.$name.'_'.$identifier.'_county","'.$vo[$identifier.'_province'].'","'.$vo[$identifier.'_city'].'","'.$vo[$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="'.($vo[$identifier] ? date('Y-m-d', $vo[$identifier]) : '').'" onFocus="WdatePicker({dateFmt:\'yyyy-MM-dd\'})"'.$form_style.$form_rule.' />';
            break;
        case 'number':
            $html = '<input type="number" name="'.$name.'['.$identifier.']" value="'.($vo[$identifier] ? $vo[$identifier] : '').'"'.$form_style . $form_rule . ' />';
            break;
        case 'hidden':
            $html = '<input type="hidden" name="'.$name.'['.$identifier.']" value="'.($vo[$identifier] ? $vo[$identifier] : '').'"'.$form_style . $form_rule . ' />';
            break;
        default:
            return '所选表单类型错误!';
            break;
    }
    $html .= $field_info['note'] . ($field_info['form_script'] ? '<script>'.stripslashes($field_info['form_script']).'</script>' : '');
    return $html;
}

 创建数据库字段

$addition = $_POST['addition'];   //表名
            $identifier = $_POST['identifier']; //字段名称
            //字段类型和长度
            $field_type = $_POST['field_type'];
            $field_length = $_POST['field_length'];
            $default_value = $_POST['default_value'];
            $form_type = $_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'));
            }

            //如果字段类型为地址框,需要创建4个字段 比如 company_address_province company_address_city company_address_county  company_address 基于company_address创建
            //ALTER TABLE `v1_apply` ADD `zx` INT(11) NOT NULL DEFAULT '0', ADD `zx1` VARCHAR(11) NOT NULL AFTER `zx`;
            //ALTER TABLE `v1_customer` ADD `sada` VARCHAR(11) NULL DEFAULT NULL AFTER `service_id`, ADD `asdada` INT(12) NOT NULL DEFAULT '0' AFTER `sada`;

            if (empty($default_value)) {
                $dd = $field_length > 0 ? $field_type . '(' . $field_length . ') not null ' : null;
            } else {
                $dd = $field_length > 0 ? $field_type . '(' . $field_length . ') not null default ' . $default_value : null;
            }

            if ($form_type == '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'] . "'";
            }

            $fields_model = M('fields');
            $fields_model->startTrans();

            if ($fields_model->add($_POST) && M()->execute($sql) === 0) { //插入数据和创建字段
                $fields_model->commit();
                alert('success', "创建成功", U('index'));
            } else {
                $fields_model->rollback();
                myLog($sql);
                alert('error', "创建失败", U('index'));
            }

这段代码其实有问题,我当时没有时间改,需要的话可能需要改下,逻辑有点问题,使用phpmyadmin创建复杂语句,拿出来改,比较好,个人建议

映射表,实际操作的对应的字段表

比如你加入一条规则的某个字段,比如 数据库 user_name 表单对应 user_name  然后写逻辑代码最好不要字段去手动对应,因为那就不自动,如有需要可以参考一下

tp数据库插入是怎么处理的

如果时间在更新通用实例demo 2017年1月5日13:39:46

 主数据库表结构 和单个商品或者页面的结果差不多,根据产品ID或者页面ID

主标
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='产品类型字段管理器'

demo图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值