php 表单自动生成

manbudezhu
  • 231

用thinkphp3.2时候,多数增删改查的页面基本相似。但是需要一个个去修改,修改列表字段,修改添加、编辑表单,重复工作要做好多次,有什么好的思路去做代码复用了?

参考大家的意见我做了如下的实现,请大家看一下谢谢:

1.先在行为中生成每个表的配置文件

        $tables=M()->query('show tables');
        $ts=[];
        foreach ($tables as $v) {
            $ts[]=$v['tables_in_addon'];
        }
        // 显示每个表的字段
        $fields=[];
        foreach ($ts as  $v) {
            $fields[$v]=M()->query("show FULL FIELDS from {$v}");
        }
        // 遍历生成配置文件
        foreach ($fields as $k => $v) {
            $filename=$k.".php";
            $path=APP_PATH.'Common\Conf\Data';
            is_dir($path)||mkdir($path,0777,true);
            $str="<?php\r\n return ".var_export($v,true).";";
            file_put_contents($path.'\\'.$filename, $str);
        }

2.然后在基础控制器中,读取控制器中数据,并分配到模版.

    public function __construct(){
        parent::__construct();
        $filename=C('DB_PREFIX')."_".lcfirst(CONTROLLER_NAME).".php";
        // 读取指定的配置器文件
        $bd=require COMMON_PATH.'/Conf/Data/'.$filename;
        $this->assign('bd',$bd);        
    }

3.在模版页面中根据字段生成表格,这里大多数input类型为text,所以我们没有做表单的类型判断.

           <form action="">
               <?php foreach($bd as $v):?>
                <?php echo $v['comment']?>:<input type="text" name="{$v['field']}"><br>
               <?php endforeach;?>
           </form>

有几个问题:
1.这样做有什么安全隐患,config目录下的表配置文件直接访问的话,直接会暴露数据库中的字段信息吧.
2.代码存在哪些问题,该怎么优化;还有什么好的解决思路.

回复
阅读 5.5k
4 个回答

没用过think,所以我只能说我能说的。
就谈我第一眼看到的一些比较不好的地方:
1.第一个,tables foreach可以换成array_columns函数,具体可以去看php官网,有介绍
2.要不断的把东西写入文件的话不要用file_put_contents,用文件流函数fopen,fwrite,fclose等.
如果坚持要用file_put_contents,可以在foreach结束后,一次把内通放入文件中.
3.在__construct里面使用require,我个人不建议这样写,可读性会很差,性能方面不了解。
4.模版的话,不知道你那边能不能用{{}} {!!}这样的模版函数.如果能用的话,看起来也会好看一点吧.(这个不重要,是我的个人偏好)

我写了一个composer,你可以参考看看。
就是为了减去一直重复的表单步骤。
PHPFORM

form-builder PHP表单生成器,快速生成现代化的form表单

宣传栏