<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>肉包子的摇滚生活 &#187; dedecms</title>
	<atom:link href="http://www.fangyuqiang.com/archives/tag/dedecms/feed" rel="self" type="application/rss+xml" />
	<link>http://www.fangyuqiang.com</link>
	<description>前端开发，交互设计，用户体验</description>
	<lastBuildDate>Wed, 01 Sep 2010 09:06:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>DedeCMS自定义模型的开发总结及一些技巧</title>
		<link>http://www.fangyuqiang.com/archives/684</link>
		<comments>http://www.fangyuqiang.com/archives/684#comments</comments>
		<pubDate>Fri, 04 Dec 2009 17:25:02 +0000</pubDate>
		<dc:creator>fangyuqiang</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[dedecms]]></category>

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