用户
 找回密码
 入住 CI 中国社区
搜索
查看: 6408|回复: 6
收起左侧

[Others] 表单自动生成的开发思路以及运行效能问题

  [复制链接]
发表于 2010-4-23 21:38:09 | 显示全部楼层 |阅读模式
各位前辈好,小弟不才问个大范围(不好意思,有些用词上的不同请多多包涵):

小弟自个儿摸索PHP没有很长的时间,较多是摸索现成的CMS,偶而课堂上学到的也仅是使用DW内建的功能,透过修改使用的接收值去操作数据库。
有玩过joomla及drupal,也用他们架了网站运行了一段时间。

因为从未自己逐行开发过系统,看了这框架后觉得用这框架达成MVC的开发方式很方便,于是便着手试着开发。
也因为底子不够厚,有些开发上的问题想与各位前辈讨论番。


个人希望程式码能够模组化重复利用最好,于是模组尽量都写的较为弹性。
也因为之前摸索cms的关系,认为模板与php最好都分开,因为希望是以系统的方式写,所以写的方式如下:


定义 config (网站的一些设定)

接着建立libraries内的MY_Controller,将一些基本需要载入的模组在MY_Controller载入)
各个控制器在透过extends MY_Controller去继承。

网站的菜单部份我是写一个模组将表单的资讯写成阵列,呼叫模组只是将阵列传出来(到时候要改成读数据库也可以,只是之前爬文,很多前辈提到最后大型网站会慢就是因为数据库太多读写)

而网站提交需要用到表单部份,我也用上述方式将表单对应资料库的相关数据写为一个阵列,透过模组呼叫回传阵列设定。
储存的阵列模组资料如下,在透过不同的function去回传不同资料表(表单)的数据。
PHP复制代码
$data = array(
                       
array(
        'display' => false,
        'name' => 'ID',
        'field' => 'did',
        'type' => 'text',
        'size' => 10,
        'default' => '',
        'class' => null        
                        ),
复制代码



读取的模组如下(片段)
PHP复制代码
foreach ($in_data as $v) {
               
        if ($v['display']){
                               
                $form_set = array(
                        'name'        => $v['field'],
                        'id'          => $v['field'],
                        'value'       => $v['default'],
                        'maxlength'   => $v['size']
                               
                );
                               
                $result .= form_label($v['name'], $v['field']);
                switch ($v['type'])
                {
                        case 'text' :
                        $result .=  form_input($form_set) ."<br />\n";
                        break;
                               
                        case 'textarea' :
                        $result .=  form_textarea($form_set) ."<br />\n";
                        break;
                               
                };
                               
        };// end if
                       
};//end foreach
复制代码


而这样写的问题就是需要一直使用 foreach去捞资料、比对资料。
我想问这样对于跟从数据库捞这些数据产生表单这种写法是否正确?

捞完资料后通常都是在透过另一个模组将资料转换为html,最后生成的html再传到view内。
也就是就单单一个需要用到表单页面就需要

1.读取设定档(表单设定)
2.将1的资料传到另一个模组去比对需要捞的资料库的资料
3.将2的结果输出为表单并转成html
4.将3的资料传到视图。

所以每多一个资料表就需要多写一个设定档(对应表单栏位),且要透过多个模组呼叫处理。
虽然开发时每写一个模组就是希望能够再次利用,但是单一个网页就需要这么多步骤,这样子的流程是合理的吗?

不好意思来这边询问,这边讨论比较热烈,很多前辈开发经验也很丰富,所以希望各位能给些开发mvc的经验,谢谢
lanc

评分

参与人数 2威望 +7 收起 理由
Hex + 5 原创内容
saturn + 2 好问题,值得思考

查看全部评分

发表于 2010-5-5 17:52:47 | 显示全部楼层
效率太低
发表于 2010-5-5 18:44:05 | 显示全部楼层
楼主的意思是动态生成表单项目?
发表于 2010-5-5 21:48:39 | 显示全部楼层
听口气是对岸的

评分

参与人数 2威望 -10 收起 理由
Hex -6 禁止灌水
saturn -4 请不要在技术版进行无意义的回复! ...

查看全部评分

发表于 2010-5-6 01:43:58 | 显示全部楼层
回复 1# lanc


1.读取设定档(表单设定)
2.将1的资料传到另一个模组去比对需要捞的资料库的资料
3.将2的结果输出为表单并转成html
4.将3的资料传到视图。

如果我没有理解错,你是希望动态的生成表单(Form)。你的方案我认为是完全可行的,如果操作得当,不用担心效能的问题。

我认为,除去前端组建中的JavaScript和HTML DOM TREE解析,WEB app最耗时和最影响效能的是上下文切换(context switching)和资料库操作。所谓上下文切换,举个例子:一个处理文件(File)内容的PHP函数,它首先会执行php代码,然后去读取file文件,最后再回到php代码,这个就是上下文切换。资料库操作不用说,就是通常的CRUD操作(实际上也是一个上下文切换的例子),这个是比较影响效能的。

也就是说,上述4个步骤,最影响效能的就是第二步,你必须保证它足够高效。比如在大的访问量下,可以考虑加入缓存机制,比如文本缓存,数据库缓存和memory cache等。

另外,关于表单自动生成,你也可以参见这个library:http://codeigniter.com/forums/viewthread/107861/
发表于 2010-5-6 12:20:19 | 显示全部楼层
对生成的表单界面做缓存,以后引用界面只引用缓存界面就好了,效率问题不大,但灵活度会小很多。当能为每个input 或select 指定特殊属性的时候,不如写个js类去包客户端操作好用一些。
 楼主| 发表于 2010-7-26 14:24:20 | 显示全部楼层
感谢saturn大替我解惑,最后还是没能使用ci开发系统。
你提到的上下文就是我担心的部份,因为我比对资料时要先从资料库读取资料,后来还要透过额外写的model去检测,这个上下文程序可能一多,速度很明显拖慢了...

因为当打算使用动态生成表单内容,变成要稍微修改功能又要动到一大块当初构想的model。
会因为当初希望方便都能够自动产生,却变成要有独立出来的表单选项时,整个当初写来自动产生的model可能又要加入不少程式,这样不见得轻松,被限制在两个开发框内(CI跟自己写的model),碍手碍脚的....

ihymk大提到了,灵活度小很多,所以放弃了。

因为没透过ci开发后,便一直未上来观看此篇回应。
最后谢谢各位的回答,小弟获益良多。

lanc

本版积分规则