表单自动生成的开发思路以及运行效能问题
各位前辈好,小弟不才问个大范围(不好意思,有些用词上的不同请多多包涵):小弟自个儿摸索PHP没有很长的时间,较多是摸索现成的CMS,偶而课堂上学到的也仅是使用DW内建的功能,透过修改使用的接收值去操作数据库。
有玩过joomla及drupal,也用他们架了网站运行了一段时间。
因为从未自己逐行开发过系统,看了这框架后觉得用这框架达成MVC的开发方式很方便,于是便着手试着开发。
也因为底子不够厚,有些开发上的问题想与各位前辈讨论番。
个人希望程式码能够模组化重复利用最好,于是模组尽量都写的较为弹性。
也因为之前摸索cms的关系,认为模板与php最好都分开,因为希望是以系统的方式写,所以写的方式如下:
定义 config (网站的一些设定)
接着建立libraries内的MY_Controller,将一些基本需要载入的模组在MY_Controller载入)
各个控制器在透过extends MY_Controller去继承。
网站的菜单部份我是写一个模组将表单的资讯写成阵列,呼叫模组只是将阵列传出来(到时候要改成读数据库也可以,只是之前爬文,很多前辈提到最后大型网站会慢就是因为数据库太多读写)
而网站提交需要用到表单部份,我也用上述方式将表单对应资料库的相关数据写为一个阵列,透过模组呼叫回传阵列设定。
储存的阵列模组资料如下,在透过不同的function去回传不同资料表(表单)的数据。
$data = array(
array(
'display' => false,
'name' => 'ID',
'field' => 'did',
'type' => 'text',
'size' => 10,
'default' => '',
'class' => null
),
读取的模组如下(片段)
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 效率太低 楼主的意思是动态生成表单项目? 听口气是对岸的:lol 回复 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/ 对生成的表单界面做缓存,以后引用界面只引用缓存界面就好了,效率问题不大,但灵活度会小很多。当能为每个input 或select 指定特殊属性的时候,不如写个js类去包客户端操作好用一些。 感谢saturn大替我解惑,最后还是没能使用ci开发系统。
你提到的上下文就是我担心的部份,因为我比对资料时要先从资料库读取资料,后来还要透过额外写的model去检测,这个上下文程序可能一多,速度很明显拖慢了...
因为当打算使用动态生成表单内容,变成要稍微修改功能又要动到一大块当初构想的model。
会因为当初希望方便都能够自动产生,却变成要有独立出来的表单选项时,整个当初写来自动产生的model可能又要加入不少程式,这样不见得轻松,被限制在两个开发框内(CI跟自己写的model),碍手碍脚的....
ihymk大提到了,灵活度小很多,所以放弃了。
因为没透过ci开发后,便一直未上来观看此篇回应。
最后谢谢各位的回答,小弟获益良多。
lanc
页:
[1]