DedeCMS自定义模型的开发总结及一些技巧
最近刚刚完成一个朋友的二手客车网站,要求要实现一个二手客车的销售展示等。这个涉及到了DedeCMS自定义模型的开发,网上的资料比较少,在开发过程中总结了一些技巧,与各位分享。
完成后的网站的地址是:http://www.365517.com
整个网站最难的地方,就在于运用自定义模型来处理二手客车的字段了。在dede的使用手册关于自定义模型有个介绍,http://help.dedecms.com/v53/archives/extend/channel/ 参考这篇文章,可以完成常用的自定义模型了。
客户要求填写二手客车资料的时候要可以选择所在地,省市二级联动。很好,dedecms自带有一个联动类别管理,在自定义模型字段名字填入联动类的名字nativeplace,这样添加修改二手客车这个自定义模型就有了 一个联动的省市选择。
现在问题来了:
- 客户需要所在地点是可以搜索的,到自定义模型的自定义搜索里面去看,发现在后台没有提供所在地的字段的搜索,原因是因为nativeplace是系统联动调用的,可能在做这个自定义搜索的时候,开发者遗漏了这一点。
- 列表中要显示一些自定义字段,如何调用?(这对熟悉dedecms的人是个简单问题我知道)
- 高级搜索可以搜索出结果出来,但是搜索出来的结果列表datalist,却无法显示自定义的字段,只能显示标题,时间点击率之类的。无法显示如car_price这些自定义的字段。
- 首页跟侧边栏都有搜索框,要求要能调用联动的地点,但是发现直接在首页跟侧边栏采用dede.field.nativeplace这样来调用行不通。猜测应该是首页跟侧边栏的解析时候根本就没有考虑这些标记。只有特定模板才会特定的解析这些标记。
这些都是些大问题,不解决不行,下面一个个来告诉你我是怎么搞定的,如果你也碰到同样的问题,也许会有帮助。
- 没提供的话就自己手动加上去。指定自定义搜索可以搜索的字段存的数据库表是dede_advancedsearch,在这个表找到addonfields这个字段,里面的内容形如:car_title:select,car_price:int,car_sites:int, 前面表示字段名,后面表示字段类型,:分开。不同的类型会采用不同的sql构造策略来搜索,比如int类型,就采用>startcar_sites and <endcar_sites这样的sql来搜索。我们这里要搜索的是nativeplace,因为存的值都是int,手动在addonfields这个字段里加上nativeplace:int,。注意,最后面一定要以逗号,结尾。因为前台程序分割后数组会pop掉最后面的空数组,没逗号的话会把要的数组给pop了。这样子手动修改了表后,虽然前台没有字段可以勾选,但是事实上这个字段已经可以搜索了。
- 这个看官方的文档后来才知道的,原来很简单,就是普通的artlist要做一点处理,形如:
{dede:arclist addfields=' 你的自定义字段 ' row='1' titlelen='30' channelid='模型ID' typeid='1'} [field:自定义字段/] {/dede:arclist} - 但是高级搜索里面就不是这么一回事了,死折腾它就是显示不出来。研究了一下高级搜索的sql语句才发现,它没有select出附加表的字段出来。打开plus/advanced_search.php再次做一下修改,找到大概在238行左右的sql语句,我大概改成这样:
"select main.id as aid,main.*,main.description as des, type.namerule,type.typedir, addon.car_price,addon.car_status from $maintable main left join #@__arctype type on type.id=main.typeid left join $addontable addon on addon.aid=main.id $where $orderby";
要注意的是,这里搜索出的字段就是可以在页面上调用显示的字段,因为原来的sql,没有select附加表的字段,所以高级搜索页面调用不了附加字段显示,这里我加了addon.car_price,addon.car_status 2个字段,另外原来type是select type.*的,但是事实上只要2个字段就可以了,不需要.*,减少select出来的字段可以一定程度的提高sql的效率。
- 首页跟侧边栏页无法直接调用联动数组例如nativeplace,因为模板没有对这个标签进行解析,有2种方法,一种是改进模板解析,使其可以识别,但是这种我觉得改动工作比较麻烦,而且不熟悉的话改不好,不是好方法。第二种就是我用的办法,直接把调用nativeplace后生成的代码copy到模板中就行了。简单方便,而且并无错误。
除了这些之外,还有几个小地方细节的改动。
每次页面操作成功跳转的时候都会显示:DEDECMS提示信息,客户希望可以去掉,说这样看起来很不专业。。搜索下对应的文件,找到ShowMsg这个方法就行了。
我还对会员中心做了大量的裁剪,我只需要简单的,可以注册会员发布一下二手客车信息就可以了,其他的收藏啊,短信息之类的统统删除掉了。
此外,后台菜单很多客户用不到的内容,我也简单的将菜单屏蔽掉了,只要修改dede/inc/inc_menu.php 中的菜单项以及dede/templets/index_menu2.htm 就可以了。看起来后台菜单简单清爽多了。
我想你可能需要一个美工。=_=|||..
快培养一下你的LP!