說到搜索功能,在一般系統中都可以看到,搜索是為了快速檢索用戶想要的內容,一般只需要輸入關鍵字就可以檢索到標題.對於數據庫設計中,一般搜索的字段都需要建立索引,這樣是為了加快搜索,mysql數據庫設計一般都會探討到這一點。joomla本身自帶搜索功能,用起來很方便,不過今天還是要來說說自己動手開發這樣一個一個功能,這樣的功能我們用一個模塊和組件實現,模塊是為了顯示輸入表單,結果顯示放到組件結果中,最后對結果進行分頁,接下來我就分析一下步驟。
表單我就不說了,只要一個文本框,不過還需要隱藏域代碼如下
<form action="index.php?option=com_golist&controller=golist&task=golist" method="post" name="go" id="go">
<input type="hidden" name="option" value="com_golist">
<input type="hidden" name="controller" value="golist">
<input type="hidden" name="task" value="golist">
<input type="hidden" name="Itemid" value="4">
<input type="text" value="請輸入關鍵字" id="key" name="key" size="20"/>
<input type="submit" class='btn' id='submit' value="搜 索">
</form>
以上就是表單,簡單說下,為啥action寫了地址,還需要隱藏域呢,我發現如果action如果只寫index.php,在分頁的時候會出現分頁丟失,就是第二頁的時候地址欄錯誤,不能分頁,所以兩邊都寫上吧,隱藏域分別是組建的的名字,控制器,任務處理函數,以及菜單id,這個組件就是結果顯示頁面。好了,我們就去task的任務里面進行處理。因為結果需要分頁,我們需要按照一個組件標准,就是控制器,模型,視圖的MVC模式,數據處理也就是搜索過程卸載model里面。用post方法或者joomla自帶的獲取這個關鍵字,然后就去數據庫查詢,一般使用SQL語句的like關鍵字。不過筆者實現的是可以搜索分類和文章功能,對於不管是文章還是分類,可以使用多關鍵字,多關鍵字結果是由單個關鍵字合並的結果。單關鍵字是由可以查到具體標題的。
對於收到的關鍵字,我們先處理是不是有空格,或者本身就是空白字符串,或者有特殊代碼,需要進行處理,然后用分詞函數轉換成數組,到分類表進行查詢,如果查詢到該分類就返回分類id用分類id去檢索該分類的文章,如果沒有查到分類,說明關鍵字是普通關鍵字,只需要到文章表進行查找,最后把結果合並顯示出來。有人是不是覺得做的太繁瑣,一個like語句搞定的事情何必麻煩,其實這里實現的還有一個就是檢索分類和檢索文章合並到一個文本框里面了,你完全可以改種方法,通過下拉菜單搜索該分類文章里面含有關鍵字的內容,或者類似自帶例子的復選,總之顯示方法多種多樣。
不得不多說,這個功能並不完美,我們知道,多關鍵字一般是為了縮小搜索結果,更精確顯示結果。不過對於搜索這個功能還在琢磨中,以后有更完美方案再分享,也歡迎高手賜教。對於結果分頁,出了些小小問題,結果分頁點到第二頁出現分頁錯誤,顯示了所有內容分頁,通過打印sql語句,發現是傳遞過來的關鍵字丟失了,沒有找到完美解決方案,最終用$_SESSION['KEY'] = $key實現傳遞取值.聽說joomla本身有解決方案,希望對分頁非常了解的朋友賜教.到底出現了什么錯誤導致分頁的獲取關鍵字丟失,就是沒有%關鍵字%不見了.
學習過程中,遇到的問題真多,不過解決問題的過程也是不錯的,可以對joomla和php更精通,主要還能學到數據庫處理,以及字符和數組處理.以前我以為學習joomla和php關系不大,現在才發現,php基礎的好壞直接決定開發過程中對joomla功能的處理.
(原創首發 Yoby 文章旨在記錄學習過程中的問題,作為筆記,都是來自實際開發中遇到問題,代碼僅供參考,如果錯誤請留言交流.)