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

主頁 > 網站建設 > 建站知識 > 織夢自定義搜索分析

織夢自定義搜索分析

POST TIME:2020-04-11 21:46

為什么要自己定義搜索呢?當我們想根據自己需要,讓用戶按照站長的要求來搜索時,這時候往往會用到自定義搜索,前臺那個搜索比較簡單,不精確,而高級搜索里面也不一定是我們希望的,這時就要自定義搜索,在分析自定義搜索以前,先看一下如何進行自定義搜索?

進入后臺——>內容模型管理——>管理下面有個放大鏡東西的圖標,點進去,就可以自己定義搜索了。如下圖,以商模型為例:

這個自定義搜索管理,分五個部分,一個是頻道ID,一個是頻道名稱,這二個都不用管,這個頻道ID和頻道名稱是如何來的呢?這二個字段值是從mychannel_main.php里面,經過查詢表dede_channeltype,后得到的,當我們點擊自定義搜索的時候,就通過mychannel__edit.php傳給模板mychannel__edit.htm了,顯示出來了。

接下來二部分就是我們要自己定義的探索字段了,一個是主表,一個是附加表,主表字段,總共五個,這五個是固定的,當然也可以在文件mychannel_main.php里面自己定義。如果頻道ID是負數,這個主表字段是沒有內容的,這是因為頻道ID為負數,說明是單表獨立模型,連主表都沒有,哪來的主表字段。

最后一項是自定義模板,這個模板是可以定義的,默認是advancedsearch.htm。

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

自定義搜索管理分析:

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

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

織夢用了一個變量$step作為處理提交與不提交的分界點,即通過$step的狀態的設置,來處理二個不同的狀態下的功能,這在php編程里面的經常用到,一般把第一個作為初始狀態,即$step一般設置為0或空,當實現第一個功能后,把$step設置成1,或者當$step=0,則在執行第一個功能代碼前或后,把$step設置成1,這樣當執行完代碼后,這時當$step=1,即上面設置的1,這樣就可以執行第二個功能代碼。這個$step相當于if else,但是要比if else靈活。

在模板中的表單里面有一項隱藏域<input type='hidden' name='step' value='<?php echo $step?>'>,這里面的值value就是文件mychannel_edit.php里面的$step,這個模板里面的<?php echo $step?>這句代碼,又是調用哪里的呢?這個其實是當我們在內容模型管理,點放大鏡進入到“自定義搜索管理”界面時,此時,程序執行的是$step=0,這時,因為剛進入“自定義搜索管理”界面,當$step=0執行后,同時把$step設置成1,此時,我們就看到了“自定義搜索管理”界面,當我們看到這個界面后,$step就已經是1了,所以,上面的<?php echo $step?>這句代碼的值就是1。

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

里面這個查詢有一個$mid,這個$mid又時哪來的?正常情況這個應當是從模板接收而來的,沒有錯,這個也是,但是模板里面的我們發現是這句代碼<input type='hidden' name='mid' value='<?php echo $mid?>'>,模板里里面的<?php echo $mid?>,這句又是調用哪里的?一般情況我們設計一個php 程序,例如:a.php在這個程序里包括a.htm模板,然后,在這個a.php文件里面從數據庫查詢出數據放入一個數組中,然后,在模板a.htm里面直接調用,當a.htm提交數據給a.php或其它php文件,就可以處理數據了。

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

如果再追問一下,這個在“內容模型管理”里面這個mid=6又是如何獲得呢?這個mid=6就是通過“內容模型管理”模板mychannel_main.htm里面的織夢標簽{dede:field.id/}得到,而這個標簽正是來自mychannel_main.php這個php文件里面的sql查詢語句。

接下來繼續看代碼:

這段代碼時從數據庫表dede_advancedsearch中,查詢出mid=6的一條記錄,放入變量$searchinfo中,然后,判斷一下這個變量是不是數組,若不是則說明,這個變量里面沒有內容,即mid=6的記錄沒有。如果存在這個記錄,而把主表字

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

分別把主表中和附加表中的內容存儲到數組$searchinfo['mainfields']和$searchinfo['addonfields']里面,即下圖所示的字段對應的內容。

接著向下執行代碼:

上面的代碼的作用是:給主表字段設置默認選擇。

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

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

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

接著執行下面三行代碼:

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

第一行用來實例化一個對象;

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

第三行:是把fieldset值即:

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

繼續執行代碼,if(is_array($dtp->CTags) && !empty($dtp->CTags))這一行代碼,是判斷$dtp->CTages是不是數據,若是并且存在,則對這個數組進行遍歷。

$dtp->CTags這是一個什么數組?這個數組是這樣的,$dtp->CTags=array(
'<field:price itemname="市場價" autofield="1" type="float"></field:price> ',
'<field:trueprice itemname="優惠價" autofield="1" type="float" ></field:trueprice>',
'<field:brand itemname="品牌" autofield="1" type="text" ></field:brand>',
'<field:units itemname="計量單位" autofield="1" type="text" ></field:units>'
)

這里作了簡單,實際這個標記集合就是$channel['fieldset']這里面字符串,通過explode()函數分割出來的數組。

通過下面的foreach($dtp->CTags as $ctag)循環,把數組里面的值,每當循環一條到$ctag里面,程序就通過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;
}

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

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

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

下面是當$step=1即,當我們點擊提交確定后,在下面顯示代碼以及預覽信息的處理代碼。

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

下面部分代碼相對比較簡單,就是對我們在后臺模型里面的添加的字段,和從數據庫表dede_advancesearch查詢出的mainfields 和addonfield進行比對,顯示,最后把生成的表單通過echo forms顯示出來,這其中用到的方法,值得我們學習一下。其它的就不用多說了。

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


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

  • 400-1100-266
主站蜘蛛池模板: 玉溪市| 精河县| 图们市| 大石桥市| 南华县| 涪陵区| 扶绥县| 新乡市| 铜鼓县| 新丰县| 三河市| 二连浩特市| 赤水市| 阜新市| 新乡市| 屏东市| 达尔| 永济市| 山东省| 台安县| 长治市| 嘉荫县| 石渠县| 武定县| 苍溪县| 静安区| 当阳市| 白城市| 玛曲县| 邵武市| 康平县| 琼海市| 临湘市| 石景山区| 内乡县| 梓潼县| 理塘县| 德庆县| 沙洋县| 汉源县| 确山县|