iwebshop是一款面向独立卖家的单用户开源网店系统,基于PHP+MySQL框架开发,通过它可以迅速建立起一个B2C网上商城。在iwebshop官网的介绍中说此系统是基于专业的MVC开发模式.但是在我为此系统编写模板时发现,iwebshop系统还是有不少设计缺陷,其中尤以query结果集信息过少最为严重!
糟糕的iwebshop开发体验
先不说iwebshop的开发文档有多么简单(我拿到的是以前付费商户购买时iwebshop送的开发文档),虽然iwebshop号称mvc开发模式,但也只是在内部结构上满足了mvc模式,其中,开发文档在讲到模板制作时,讲了两种添加页面的方法,即使用控制器和添加模板文件.无论从discuz的模板系统还是thinkPHP的模板系统来看,实现模板页面都是要前台/后台合作来完成的,而iwebshop确没有在这里好好考虑.这就导致了前台并不能很好的使用后台所准备的数据,后台也不能多元化的调用前台页面.所以,在iwebshop的示例中,他就"隆重推荐""完全"使用模板来开发.其中,最大最大的表现就是----数据库查询居然是在前台模板文件中写的!!
开发文档在讲到模板标签时,有这样的一段话:"以上的标签存在着一个很大缺点就是,如果美工在开发与调试页面的时候,都会受到标签的干扰,使美工不易于开发,再一个对程序人员来说,对于每一个属性也没必要去写那些没有必要的引号,鉴于以上情况标签格式定义如下".
没错!复杂的模板符号确实给前台美工带来不便..可是...可是...把一大串sql语句放在前台模板文件中就真的不会影响美工了吗?

而且,mvc模式就是为了前台后台分离,这样做还是把数据与控制带到了前台,为什么不能在.php文件中做好数据的查询呢!
于是,基于这样鸡肋的数据库查询方式,一个重大问题出现了...
商店系统,总都是分块显示的,假如一行约定显示4个商品,若总共5个商品,那么为了美观,就应该显示一排,等数据多于8个时,再显示成两排,没错吧?可就这样一个简单的需求,用iwebshop就很难实现,因为在他的query查询结果集中,根本就没有一点行列数量等各种数据,有的只是对象化了的sql语句而已~~
于是我开启了google,网上一搜,这样的需求还真不少,官方的开发者论坛就有几个帖子问这个问题.可是,iwebshop的社区真是冷的没话说,2011年的这个帖子到现在也木有人回,好吧!那就只能自己来了!
我的实现方法是这样的:
先用count(*)取出所有的结果数量,然后向下取到3或者4(取决于一行显示几个)的倍数,然后再做一次query,limit前面的数量.这样就能控制版面的整齐了.不过,多做了一次至少有一个连接的sql查询,实在是天大的浪费.
下面是一个遍历所有模块,并且按一行3个显示各个模块下商品的代码示例.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | <! --遍历模块--> {query: name =model fields=id, name item=$mods } <! --模块id--> { set :$mod=$mods[ 'id' ]} <! --取出能展示的数量--> {query: name =promotion as p join = left join goods as go on go.id eq p.condition fields= count (*) as count where =go.model_id eq ($mod) and p.type eq 1 and p.is_close eq 0 and go.is_del eq 0 and NOW() l end_time and go.id is not null item=$ count } <! --大于3才显示--> {if:$ count [ 'count' ] >= 3} {$mods[ 'name' ]}: { set :$lim=floor($ count [ 'count' ]/3) * 3;} {query: name =promotion as p join = left join goods as go on go.id eq p.condition fields=p.start_time as start,p.end_time as end ,go.list_img as img, p. name as name , p.award_value as award,go.id as gid,p.id as pid where =go.model_id eq ($mod) and p.type eq 1 and p.is_close eq 0 and go.is_del eq 0 and NOW() l end_time and go.id is not null order =end_time asc limit=$lim } 名称:{$item[ 'name' ]}<br/> 价格:{$item[ 'award' ]}<br/> 开始:{$item[ 'start' ]}<br/> 结束:{$item[ 'end' ]}<br/> 图片:{$item[ 'img' ]}<br/> <hr/> {/query} { else :} {/if} {/query} {/query} |