產品詳情頁調用相關產品最常見的應用就是裝飾公司網站,設計師頁面要求調取設計師做過的案例。aspcms本身有這個功能,但不能完全符合要求,看代碼
{aspcms:content sort={aspcms:sortid} num=10 order=order}
<a href='[content:link]' >
<img src='[content:pic]' />
</a>
<a href="[content:link]">[content:title len=12]</a>
{/aspcms:content}
這個只能讀取指定欄目的相關產品,把每個設計師做設置成欄目很顯然不太現實,這種情況下就只能改程序了,本人這里做了個接口,放在根目錄api文件夾下
<!--#include file="../inc/AspCms_SettingClass.asp" -->
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<%
Function VbsUnEscape(str)
Dim x
x=InStr(str,"%")
Do While x>0
VbsUnEscape=VbsUnEscape&Mid(str,1,x-1)
If LCase(Mid(str,x+1,1))="u" Then
VbsUnEscape=VbsUnEscape&ChrW(CLng("&H"&Mid(str,x+2,4)))
str=Mid(str,x+6)
Else
VbsUnEscape=VbsUnEscape&Chr(CLng("&H"&Mid(str,x+1,2)))
str=Mid(str,x+3)
End If
x=InStr(str,"%")
Loop
VbsUnEscape=VbsUnEscape&str
End Function
%>
<%
dim desginer,res
desginer = VbsUnEscape(Request.Form("des"))
Function makeList(desginer)
dim rs
set rs =conn.exec("select * from {prefix}Content where ContentStatus=1 and IsRecommend=1 and P_author='"&desginer&"'","r1")
res = "["
do While not rs.eof
res = res & "{"
res = res & """ContentID"":" & rs("ContentID")&","
res = res & """title"":""" & rs("title")&""","
res = res & """IndexImage"":""" & rs("IndexImage")
rs.MoveNext
if not rs.eof then
res = res & """},"
else
res = res & """}"
end if
loop
res = res & "]"
rs.close : set rs=nothing
makeList = res
End Function
%>
<%
response.Write makeList(desginer)
%>
該api接受設計師參數,從數據庫中查出符合條件的數據,然后返回,前台通過ajax獲取(由於ajax不支持GB2312,遇到中文就亂碼,所以發送ajax請求前先對參數進行編碼,然后再解碼)
var $related = $(".related");//相關產品容器
var desginer = $(".related-title").attr("data-author");//查詢參數
console.log(desginer);
$.post("/api/AspCms_Api.asp", {des: escape(desginer)}, function(res) {
var works = JSON.parse(res.slice(res.indexOf("["), res.length));
var templateStr = "<ul class='related-item clearfix'>"
works.forEach(function(item, index) {
templateStr += "<li><a href='/content/?" + item.ContentID + ".html'><img src=" + item.IndexImage + "><span>" + item.title + "</span></a></li>"
});
templateStr += "</ul>"
$related.html(templateStr);
})
前台通過ajax獲取數據,並塞入容器
后台也要做一些設置,先到“內容維護”->“內容參數管理”欄目添加參數,這里控件類型選擇單選,在備選內容中輸入設計師,錄入產品的時候記得給案例選擇設計師。這里有個問題,如果再次編輯參數,“備選內容”區域是不顯示的,因此需要更改/_content/_Spec/AspCms_SpecEdit.asp?action=update&id=5文件

去掉display:none,並對控件類型做個判斷,不是所有情況下“備選內容”都要顯示的
<script type="text/javascript">
if(<%=SpecControlType%>!==6){
document.getElementById("trSpecOptions").style.display="none";
}
</script>
判斷SpecControlType字段,只有在單選的情況下才顯示“備選內容”
“備選內容”的值輸出由<%=SpecOptions%>改成<%=decode(SpecOptions)%>,新建“內容參數”保存時會進行編碼,這里要解碼。
最后一步,修改保存函數
Sub EditSpecSave
dim sql,rsObj
SpecField=filterPara(getForm("SpecField","post"))
SpecID=filterPara(getForm("SpecID","post"))
SpecOptions=filterPara(getForm("SpecOptions","post"))
SpecDiversification=filterPara(getForm("SpecDiversification","post"))
SpecControlType=filterPara(getForm("SpecControlType","post"))
SpecName=filterPara(getForm("SpecName","post"))
SpecCategory=filterPara(getForm("SpecCategory","post"))
SpecOrder=filterPara(getForm("SpecOrder","post"))
SpecNotNull=filterPara(getForm("SpecNotNull","post"))
SpecOptions = encode(SpecOptions)//對SpecOptions進行編碼
if SpecNotNull = "on" then
SpecNotNull = true
else
SpecNotNull = false
end if
sql = "select * from {prefix}SpecSet where SpecID="&SpecID
Set rsObj=conn.Exec(sql,"r1")
sql = "update {prefix}SpecSet set SpecName='"&SpecName&"',SpecCategory='"&SpecCategory&"',SpecOptions='"&SpecOptions&"',SpecOrder="&SpecOrder&",SpecNotNull="&SpecNotNull&" where SpecID="&SpecID
//sql語句不再提交SpecControlType,默認會再次提交的,從而導致SpecControlType變成空
conn.Exec sql,"exe"
alertMsgAndGo "修改成功","AspCms_Spec.asp"
End Sub
這樣要添加設計師時就可以直接在“內容參數管理”界面添加了
