婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 網(wǎng)站建設(shè) > 建站知識(shí) > 織夢(mèng)自定義搜索分析

織夢(mèng)自定義搜索分析

POST TIME:2020-04-11 21:46

為什么要自己定義搜索呢?當(dāng)我們想根據(jù)自己需要,讓用戶按照站長(zhǎng)的要求來(lái)搜索時(shí),這時(shí)候往往會(huì)用到自定義搜索,前臺(tái)那個(gè)搜索比較簡(jiǎn)單,不精確,而高級(jí)搜索里面也不一定是我們希望的,這時(shí)就要自定義搜索,在分析自定義搜索以前,先看一下如何進(jìn)行自定義搜索?

進(jìn)入后臺(tái)——>內(nèi)容模型管理——>管理下面有個(gè)放大鏡東西的圖標(biāo),點(diǎn)進(jìn)去,就可以自己定義搜索了。如下圖,以商模型為例:

這個(gè)自定義搜索管理,分五個(gè)部分,一個(gè)是頻道ID,一個(gè)是頻道名稱,這二個(gè)都不用管,這個(gè)頻道ID和頻道名稱是如何來(lái)的呢?這二個(gè)字段值是從mychannel_main.php里面,經(jīng)過(guò)查詢表dede_channeltype,后得到的,當(dāng)我們點(diǎn)擊自定義搜索的時(shí)候,就通過(guò)mychannel__edit.php傳給模板mychannel__edit.htm了,顯示出來(lái)了。

接下來(lái)二部分就是我們要自己定義的探索字段了,一個(gè)是主表,一個(gè)是附加表,主表字段,總共五個(gè),這五個(gè)是固定的,當(dāng)然也可以在文件mychannel_main.php里面自己定義。如果頻道ID是負(fù)數(shù),這個(gè)主表字段是沒(méi)有內(nèi)容的,這是因?yàn)轭l道ID為負(fù)數(shù),說(shuō)明是單表獨(dú)立模型,連主表都沒(méi)有,哪來(lái)的主表字段。

最后一項(xiàng)是自定義模板,這個(gè)模板是可以定義的,默認(rèn)是advancedsearch.htm。

以上是簡(jiǎn)單的介紹一下自定義搜索各項(xiàng),如何定義呢?很簡(jiǎn)單,選擇你想讓用戶搜索時(shí)的作為條件的選項(xiàng),點(diǎn)下面的確定,程序即可以生成代碼,把代碼放入html里面即可。這樣我們定義好的表單就是搜索表單,而advancedsearch.htm就是搜索結(jié)果頁(yè),處理搜索的程序文件就是advancedsearch.php文件。

自定義搜索管理分析:

自定義搜索管理對(duì)應(yīng)的處理程序是mychannel_edit.php,對(duì)應(yīng)的模板文件是mychannel_modifysearch.htm。自定義搜索主表字段和附加表字段如何實(shí)現(xiàn)?當(dāng)我們選擇好要搜索的字段,點(diǎn)確定后,下面生成的html代碼又是如何實(shí)現(xiàn)的?要實(shí)現(xiàn)這二個(gè)功能,打開(kāi)文件mychannel_edit.php,找到506行,從else if($dopost == 'modifysearch')開(kāi)始,一直到else if($dopost == 'del')結(jié)束,之間的代碼就是用來(lái)實(shí)現(xiàn)上面二個(gè)功能的,第二個(gè)功能的實(shí)現(xiàn)離不開(kāi)模板文件mychannel_modifysearch.htm配合。

先分析一下那主表字段和附加表字段,是如何得到的,這幾百行代碼通過(guò)變量$step分成二大部分,當(dāng)$step=0 時(shí),就是上面部分得到主表字段和附加表字段,如上面的圖所示。當(dāng)$step=1 時(shí),即當(dāng)點(diǎn)擊確實(shí)后,生成的html代碼,以及預(yù)覽部分,如下圖所示。

織夢(mèng)用了一個(gè)變量$step作為處理提交與不提交的分界點(diǎn),即通過(guò)$step的狀態(tài)的設(shè)置,來(lái)處理二個(gè)不同的狀態(tài)下的功能,這在php編程里面的經(jīng)常用到,一般把第一個(gè)作為初始狀態(tài),即$step一般設(shè)置為0或空,當(dāng)實(shí)現(xiàn)第一個(gè)功能后,把$step設(shè)置成1,或者當(dāng)$step=0,則在執(zhí)行第一個(gè)功能代碼前或后,把$step設(shè)置成1,這樣當(dāng)執(zhí)行完代碼后,這時(shí)當(dāng)$step=1,即上面設(shè)置的1,這樣就可以執(zhí)行第二個(gè)功能代碼。這個(gè)$step相當(dāng)于if else,但是要比if else靈活。

在模板中的表單里面有一項(xiàng)隱藏域<input type='hidden' name='step' value='<?php echo $step?>'>,這里面的值value就是文件mychannel_edit.php里面的$step,這個(gè)模板里面的<?php echo $step?>這句代碼,又是調(diào)用哪里的呢?這個(gè)其實(shí)是當(dāng)我們?cè)趦?nèi)容模型管理,點(diǎn)放大鏡進(jìn)入到“自定義搜索管理”界面時(shí),此時(shí),程序執(zhí)行的是$step=0,這時(shí),因?yàn)閯傔M(jìn)入“自定義搜索管理”界面,當(dāng)$step=0執(zhí)行后,同時(shí)把$step設(shè)置成1,此時(shí),我們就看到了“自定義搜索管理”界面,當(dāng)我們看到這個(gè)界面后,$step就已經(jīng)是1了,所以,上面的<?php echo $step?>這句代碼的值就是1。

分析當(dāng)$step為空時(shí)的代碼,如下面代碼:
if(empty($step))
{
$step = 1;
$mid = intval($mid);
$query = "SELECT mainfields, addonfields, template FROM dede_advancedsearch WHERE mid='$mid'";

里面這個(gè)查詢有一個(gè)$mid,這個(gè)$mid又時(shí)哪來(lái)的?正常情況這個(gè)應(yīng)當(dāng)是從模板接收而來(lái)的,沒(méi)有錯(cuò),這個(gè)也是,但是模板里面的我們發(fā)現(xiàn)是這句代碼<input type='hidden' name='mid' value='<?php echo $mid?>'>,模板里里面的<?php echo $mid?>,這句又是調(diào)用哪里的?一般情況我們?cè)O(shè)計(jì)一個(gè)php 程序,例如:a.php在這個(gè)程序里包括a.htm模板,然后,在這個(gè)a.php文件里面從數(shù)據(jù)庫(kù)查詢出數(shù)據(jù)放入一個(gè)數(shù)組中,然后,在模板a.htm里面直接調(diào)用,當(dāng)a.htm提交數(shù)據(jù)給a.php或其它php文件,就可以處理數(shù)據(jù)了。

但是在mychannel_edit.php文件里面,我們無(wú)法找到從表中查詢出字段mid來(lái)的代碼?這個(gè)$mid到底如何而來(lái)?這還要回到“內(nèi)容模型管理”界面,當(dāng)我們點(diǎn)放大鏡,進(jìn)行自定義搜索時(shí),實(shí)際上是點(diǎn)擊的<a href='mychannel_edit.php?mid=6&dopost=modifysearch'><img src='images/gtk-search.png' alt='自定義搜索' title='自定義搜索' /></a> 這個(gè)超鏈接,這個(gè)鏈里面有mid=6,當(dāng)我們進(jìn)入“自定義搜索”時(shí),文件mychannel_edit.php就通過(guò)$mid = intval($mid);這句代碼,得到了mid=6,即模型ID為6,此時(shí),模板也獲得了mid=6,所以,我們?cè)?ldquo;自定義搜索”界面看到“頻道ID:”的值為6。

如果再追問(wèn)一下,這個(gè)在“內(nèi)容模型管理”里面這個(gè)mid=6又是如何獲得呢?這個(gè)mid=6就是通過(guò)“內(nèi)容模型管理”模板mychannel_main.htm里面的織夢(mèng)標(biāo)簽{dede:field.id/}得到,而這個(gè)標(biāo)簽正是來(lái)自mychannel_main.php這個(gè)php文件里面的sql查詢語(yǔ)句。

接下來(lái)繼續(xù)看代碼:

這段代碼時(shí)從數(shù)據(jù)庫(kù)表dede_advancedsearch中,查詢出mid=6的一條記錄,放入變量$searchinfo中,然后,判斷一下這個(gè)變量是不是數(shù)組,若不是則說(shuō)明,這個(gè)變量里面沒(méi)有內(nèi)容,即mid=6的記錄沒(méi)有。如果存在這個(gè)記錄,而把主表字

段里面的字符串通過(guò),下面二句代碼:
$searchinfo['mainfields'] = explode(',', $searchinfo['mainfields']);
$searchinfo['addonfields'] = explode(',', $searchinfo['addonfields']);

分別把主表中和附加表中的內(nèi)容存儲(chǔ)到數(shù)組$searchinfo['mainfields']和$searchinfo['addonfields']里面,即下圖所示的字段對(duì)應(yīng)的內(nèi)容。

接著向下執(zhí)行代碼:

上面的代碼的作用是:給主表字段設(shè)置默認(rèn)選擇。

上面的代碼是把主表字段列出存儲(chǔ)到變量$mainfields里面,為得是在模板里面調(diào)用顯示。

附件表自定義搜索字段處理:

接著上面的代碼,下面的代碼是對(duì)附件表自定義字段處理。首頁(yè)查詢模型表dede_channeltype,查出一條記錄放入$channel這個(gè)變量中,然后,定義一個(gè)搜索類型數(shù)組$searchtype,這是為后面的需要進(jìn)行初始化工作。

接著執(zhí)行下面三行代碼:

$dtp = new DedeTagParse();
$dtp->SetNameSpace("field", "<", ">");
$dtp->LoadSource($channel['fieldset']);

第一行用來(lái)實(shí)例化一個(gè)對(duì)象;

第二行設(shè)置命名空間,默認(rèn)情況下執(zhí)行標(biāo)簽是{dede:標(biāo)記名}{/dede:標(biāo)記名}這種形式的,而這里重新定義標(biāo)簽為<field:字段名 ...></field:字段名>例如<field:price itemname="市場(chǎng)價(jià)" autofield="1" notsend="0" type="float"事處isnull="true" islist="1" default="" maxlength="" page=""></field:price>。

第三行:是把fieldset值即:

把上面的值載入模板字符串,也就是根目錄data/tplcache/md5加密碼.inc,然后再通過(guò)方法(函數(shù))LoadTemplate(md5加密碼.inc)載入模板文件,若文件已經(jīng)存在則直接解析模板,若緩存文件不存在,則把個(gè)文件進(jìn)行緩存,雖然,這里就說(shuō)了這幾句,但是這一系統(tǒng)方法(函數(shù))是比較復(fù)雜的,可以查看類文件dedetag.class.php文件。

繼續(xù)執(zhí)行代碼,if(is_array($dtp->CTags) && !empty($dtp->CTags))這一行代碼,是判斷$dtp->CTages是不是數(shù)據(jù),若是并且存在,則對(duì)這個(gè)數(shù)組進(jìn)行遍歷。

$dtp->CTags這是一個(gè)什么數(shù)組?這個(gè)數(shù)組是這樣的,$dtp->CTags=array(
'<field:price itemname="市場(chǎng)價(jià)" autofield="1" type="float"></field:price> ',
'<field:trueprice itemname="優(yōu)惠價(jià)" autofield="1" type="float" ></field:trueprice>',
'<field:brand itemname="品牌" autofield="1" type="text" ></field:brand>',
'<field:units itemname="計(jì)量單位" autofield="1" type="text" ></field:units>'
)

這里作了簡(jiǎn)單,實(shí)際這個(gè)標(biāo)記集合就是$channel['fieldset']這里面字符串,通過(guò)explode()函數(shù)分割出來(lái)的數(shù)組。

通過(guò)下面的foreach($dtp->CTags as $ctag)循環(huán),把數(shù)組里面的值,每當(dāng)循環(huán)一條到$ctag里面,程序就通過(guò)ctag->GetAtt('type')和$ctag->GetName()得到類型和值。例如:第一條ctag->GetAtt('type')=float,$catg->GetName=price。

代碼 if($channel['issystem'] < 0)
{
$_oo = array('channel','arcrank', 'title', 'senddate', 'mid', 'click', 'flag', 'litpic', 'userip', 'lastpost', 'scores', 'goodpost', 'badpost', 'endtime');
if(in_array($value, $_oo)) continue;
}

這一段判斷是不是獨(dú)立單表模型,例如分類信息,若是則判斷$ctag->GetName()值在不是數(shù)組$_oo里面,若在里面,則去掉($_oo里面都是附件表不想在自定義搜索里面出現(xiàn)的,如果相在自定義搜索里面出現(xiàn)則可以改這個(gè)數(shù)組)則通過(guò)countinue跳出循環(huán),繼續(xù)下一個(gè)循環(huán)。

若數(shù)據(jù)類型在我們定義的搜索類型$searchtype里面,則設(shè)置默認(rèn)值,把要顯示的字符串,存入字段$addonfields里面。

到目前為止,“自定義搜索管理”界面結(jié)束。

下面是當(dāng)$step=1即,當(dāng)我們點(diǎn)擊提交確定后,在下面顯示代碼以及預(yù)覽信息的處理代碼。

這個(gè)處理同上面一樣,也是分為二大部分,一是主表顯示的處理,二是附件表的顯示處理。

下面部分代碼相對(duì)比較簡(jiǎn)單,就是對(duì)我們?cè)诤笈_(tái)模型里面的添加的字段,和從數(shù)據(jù)庫(kù)表dede_advancesearch查詢出的mainfields 和addonfield進(jìn)行比對(duì),顯示,最后把生成的表單通過(guò)echo forms顯示出來(lái),這其中用到的方法,值得我們學(xué)習(xí)一下。其它的就不用多說(shuō)了。

再一個(gè)比較重要的地方就是在模板mychannel_modifysearch.htm里面,織夢(mèng)用了一個(gè)框架<iframe name="stafrm" frameborder="0" id="stafrm" width="100%" height="100%"></iframe>接收提交表單后的內(nèi)容,在這個(gè)框架里顯示,接收是通過(guò)<form name="form1" action="mychannel_edit.php" method="post" target="stafrm">里面的target="stafrm,這當(dāng)然不是php 應(yīng)用,而是簡(jiǎn)單的html應(yīng)用,雖然簡(jiǎn)單,但是一個(gè)非常好的小技巧。以后進(jìn)行二次開(kāi)發(fā),我們可以用得著這個(gè)東西。


收縮
  • 微信客服
  • 微信二維碼
  • 電話咨詢

  • 400-1100-266
主站蜘蛛池模板: 陆川县| 左云县| 大城县| 汉阴县| 比如县| 遂川县| 高阳县| 拜泉县| 浑源县| 肇源县| 本溪| 平罗县| 木里| 南城县| 建湖县| 西畴县| 富锦市| 兰溪市| 云霄县| 湘乡市| 黎川县| 当涂县| 耿马| 蒙自县| 察哈| 尉氏县| 杭锦旗| 天津市| 高唐县| 军事| 古交市| 双辽市| 德惠市| 天峨县| 嵊州市| 繁峙县| 涞水县| 洛隆县| 明溪县| 石柱| 金华市|