账号通
    

账号  

密码  

4334

查看

9

回复
主题:让模型中自定义字段下拉列表支持SQL语句 [收藏主题] 本贴被认定为精华 转到:  
sysback 当前离线

23

主题

0

广播

1

粉丝
添加关注
级别:学前班

用户积分:188 分
登录次数:89 次
注册时间:2010/11/26
最后登录:2016/2/19
sysback 发表于:2013/6/14 22:42:11   | 显示全部帖子 查看该作者主题 楼主 
科汛在线商城系统(NET)

'科汛官方的模型中自定义字段下拉列表并不支持SQL语句,但有时确实需要这样做,经过修改完全可以实现。
'修改ks_cls文件夹下的Kesion.AdministratorCls.asp,共修改两个地方并添加一个自定义函数。
'修改一:
'找到下面这段代码
'===================================
Case 3,11
If fieldtype=11 Then
GetDiyField=GetDiyField & "<select class=""upfile"" style=""width:" & XWidth & "px"" name=""" & fieldname & """fill" & fieldname &"(this.value)""><option value=''>---请选择---</option>"
Else
GetDiyField=GetDiyField & "<select class=""upfile"" style=""width:" & XWidth & "px"" name=""" & fieldname & """>"
End If
  O_Arr=Split(Node.SelectSingleNode("options").text,"\n"): O_Len=Ubound(O_Arr)
....
....
'===================================

'将334行的 O_Arr=Split(Node.SelectSingleNode("options").text,"\n"): O_Len=Ubound(O_Arr) 这句代码
'改为下面这一段代码:
'------------------------------------------------
Dim Options
Options=Node.SelectSingleNode("options").text
if InStr(Options,"{SQL:")>0 then
Options=GetSqlOptionStr(Options)
end if
O_Arr=Split(Options,"\n")
O_Len=Ubound(O_Arr)
'------------------------------------------------

'修改二:
'找到下面这段代码
'===================================
'取得联动菜单
Function GetLinkAgeMenuStr(ChannelID,FieldXML,FieldDictionary,byVal ParentFieldName,JSStr)
Dim OptionS,OArr,I,VArr,V,F,Str,Node,FieldName
If ParentFieldName="0" Or ParentFieldName="" Then Exit Function
Dim PNode:Set PNode=FieldXML.DocumentElement.selectsinglenode("fielditem[parentfieldname='" & ParentFieldName &"']")
If not pnode is nothing Then
FieldName=pnode.selectsinglenode("@fieldname").text
Str=Str & " <select name='" & FieldName & "' id='" & FieldName & "' onchange='fill" & FieldName & "(this.value)' style='width:" & pnode.selectsinglenode("width").text & "px'><option value=''>--请选择--</option>"
JSStr=JSStr & "var sub" &ParentFieldName & " = new Array();" &vbcrlf
Options=pnode.selectsinglenode("options").text
....
....
'===================================

在433行 Options=pnode.selectsinglenode("options").text 这句代码下面添加下面这段代码:
'--------------------------------------------------
if InStr(Options,"{SQL:")>0 then
Options=GetSqlOptionStr(Options)
end if
'--------------------------------------------------

'添加一个自定义函数
'在467行  ==============复制操作开始============= 这句代码前面添加如下函数代码:

'---------------------------------------------------
' 下拉列表通过SQL语句调用数据库
'---------------------------------------------------

以下内容只有回复后才可以浏览,请先登录!

'----------------------------------------------------------------------
' 要进一步完善系统,还有其它几个文件需要修改,这就由科汛官方去做了。
'----------------------------------------------------------------------

'使用方法:
在后台模型--->选择需要添加自定义字段的模型,如“文章系统 KS_Article”,
或添加新模型,按要求设置好新模型后,进入“字段管理”--->新增字段
在字段类型处选“下拉列表(select)" 或"联动下拉列表”
如果是“下拉列表(select)” 或是“联动下拉列表”的“所属父级字段”为“--作为一级联动--”
在下面的“列表选项”处输入:{SQL:select 字段名一 from 表一}
如果是“联动下拉列表”的“所属父级字段”为二级联动
则在下面的“列表选项”处输入:{SQL:select 字段名二,字段名三 from 表二}
注意这里的"字段名二"查询得到的结果应该与一级联动的可选项内容相同,即与“字段名一”的内容相同,“字段名三才是本级的可选项内容。

如果是“联动下拉列表”的“所属父级字段”为三级联动
则在下面的“列表选项”处输入:{SQL:select 字段名四,字段名五 from 表三}
注意这里的"字段名四"查询得到的结果应该与二级联动的可选项内容相同,即与“字段名三”的内容相同,“字段名五才是本级的可选项内容。
注:联动下拉列表时第一级也可不使用SQL语句,但要保证第二级下拉联动的字段名二的内容与一级的选项内容相同。

例如要按省-->市-->县 三级联动选择,需要建三个表,分别是:
1、代表“省名称”的表: KS_U_sjb_a ,包含两个字段 KS_U_Name,KS_U_Ordid,分别是省名称和排序序号
2、代表“市名称”的表: KS_U_sjb_b ,包含三个字段 KS_U_Sjname,KS_U_Name,KS_U_Ordid,分别是省名称、市名称和排序序号
3、代表“县名称”的表: KS_U_sjb_c ,包含三个字段 KS_U_Sjname,KS_U_Name,KS_U_Ordid,分别是市名称、县名称和排序序号

第一级联动的“列表选项”语句为:{SQL:select KS_U_Name from KS_U_sjb_a order by KS_U_Ordid}
第二级联动的“列表选项”语句为:{SQL:select KS_U_Sjname,KS_U_Name from KS_U_sjb_b order by KS_U_Ordid}
第三级联动的“列表选项”语句为:{SQL:select KS_U_Sjname,KS_U_Name from KS_U_sjb_c order by KS_U_Ordid}
注意二、三级联动的语句中字段顺序不要搞错!
当然如果你熟悉SQL语法,可以加入 where 子句等,由你发挥了。



现在还有个问题,如何实现一对多的下拉联动,即一个一级下拉列表对应多个二级下拉列表,或一个二级下拉列表对应多个三级下拉列表.

哪位有好办法不妨贡献出来!

 
  支持(1) | 反对(0) 回到顶部顶端 回到底部底部
<上一主题 | 下一主题 >
Powered By KesionCMS Version X1
厦门科汛软件有限公司 © 2006-2016 页面执行0.07861秒 powered by KesionCMS 9.0