在上一篇文章中,我們熟悉了Joomla智慧搜尋元件的功能,討論了使用CRON進行定時索引的參數和配置。讓我們開始為我們自己的插件創建程式碼。
在開始技術部分之前,我將提到一些直接涉及主題的文章。以及一般涵蓋 Joomla 4 / Joomla 5 現代架構的插件的創建和/或更新的文章。接下來,我將假設讀者已經閱讀了它們並且通常了解如何製作工作插件對於 Joomla:
對於有經驗的開發人員,我會說搜尋插件擴展了 JoomlaComponentFinderAdministratorIndexerAdapter 類,該類文件位於 administrator/components/com_finder/src/Indexer/Adapter.php。好吧,然後他們會自己解決這個問題。此外,作為範例,您可以在 plugins/finder 資料夾中研究 Joomla 核心智慧搜尋外掛程式 - 用於文章、類別、聯絡人、標籤等。我為 JoomShopping(Joomla 電子商務組件)和 SW JProjects(您自己的帶有更新伺服器的 Joomla 擴展目錄組件)組件開發了一個智能搜尋插件,因此類名稱和一些細微差別將與它們相關聯。我將使用 JoomShopping 的範例來展示其中的大部分內容。多語言問題的解決方案是基於 SW JProjects 的範例。
Joomshopping 智慧搜尋插件的檔案結構與典型的沒有什麼不同:
Joomla 5 智慧搜尋外掛程式檔案結構
檔案provider.php允許您在Joomla DI容器中註冊插件,並允許您使用MVCFactory從外部存取插件方法。
這是包含外掛程式主要工作程式碼的檔案。它應該位於 src/Extension 資料夾中。就我而言,插件類別 JoomlaPluginFinderWtjoomshoppingfinderExtensionWtjoomshoppingfinder 位於檔案 plugins/finder/wtjoomshoppingfinder/src/Extension/Wtjoomshoppingfinder.php 中。該插件的命名空間是 JoomlaPluginFinderWtjoomshoppingfinderExtension。
操作需要最少的類別屬性和方法集(它們可以被訪問,包括由父 Adapter 類別訪問)。
…這裡我們開始深入研究細節,因為 getListQuery() 方法並不是真正強制性的,儘管文件和大多數文章都討論了它。
任何關於「複雜方案」主題的圖片都可以在這裡。
令人驚訝的是,有時一些資訊或想法在我們注意到並意識到之前就已經在我們身邊轉了一圈了!很多東西,在我們眼前一年多了,還沒有達到認知,需要經過多年的體驗,我們的注意力才集中到它們上。
關於 Joomla,由於某種原因,它的元件並沒有立即呈現出 Joomla 的某種通用架構特徵(儘管這是一個明顯的事實)。包括資料庫表結構層面。讓我們來看看 Joomla 內容表的一些欄位。我會保留的是,具體的列名對我們來說並不是那麼重要(你可以隨時查詢 SELECT name AS title),一個索引元素的資料結構是多少:
如果我們比較表格#__content(Joomla文章)、#__contact_details(聯絡人元件)、#__tags(Joomla標籤)、#__categories(Joomla類別元件),那麼我們會發現幾乎所有列出的資料類型都無處不在。
如果建立智慧搜尋外掛的元件遵循「Joomla方式」並繼承其架構,那麼您可以在外掛程式類別中使用最少的方法。如果開發人員決定不尋找簡單的方法而走自己的路,那麼您將不得不走困難的路,重新定義 Adapter 類別的幾乎所有方法。
此方法在 3 種情況下被呼叫:
讓我們來看看 Joomla 核心外掛程式的實作範例:
getListQuery()方法傳回一個DatabaseQuery對象,該物件是查詢建構函式的對象,其中已經指定了資料表的名稱和所選的欄位。在呼叫它的方法中繼續使用它。
如果從 DatabaseQuery $query 物件中的 getContentCount() 呼叫 getListQuery(),則 select 的設定值將會被取代為 COUNT(*)。
如果從 getItem($id) 呼叫 getListQuery(),則條件 $query->where('a.id = ' . (int) $id) 並且只選擇特定元素。在這裡我們已經看到父 Adapter 類別在查詢中包含作為 a.* 的表名稱。這意味著我們也應該在 getListQuery() 方法的實作中使用這些前綴。
在從 getItems() 呼叫 getListQuery() 的情況下,$offset 和 $limit 將會加入我們建立的查詢中,以便在元素清單中移動以進行索引。
總結: getListQuery() - 必須包含三個不同 SQL 查詢的「工作片段」。 在這裡實作 Joomla 並沒有什麼特別困難的。但是,如果有必要,您可以自行實作 3 個方法,而無需建立 getListQuery()。
非 Joomla 方式: 就 JoomShopping 而言,我發現一個產品可以有多個類別,並且歷史上該產品的類別 id (catid) 組件存儲在單獨的表中。同時,多年來一直無法指定產品的主要類別。收到產品類別後,查詢將傳送至類別表,其中僅取得第一個查詢結果,按預設類別 ID 排序 - 即升序。如果我們在編輯產品時更改類別,則主要產品類別是 ID 號碼較小的類別。產品的 URL 以此為基礎,產品可以從一個類別跳到另一個類別。
但是,大約 2 年前,這種 JoomShopping 行為已被修復。由於該組件歷史悠久,受眾眾多,並且不能僅僅破壞向後兼容性,修復是可選的。必須在組件設定中啟用指定產品主類別的功能。然後 main_category_id 將會填入有產品的表中。
但這個功能預設是關閉的。 而在智慧搜尋外掛程式中,我們需要取得JoomShopping組件的參數,看看是否啟用了指定主商品類別的選項(並且它最近可能啟用,並且未指定某些產品的主類別- 也是一個細微差別...)並產生SQL 查詢以根據組件參數接收產品:或者是一個簡單的查詢,其中我們添加main_category_id字段,或以舊的錯誤方式獲取類別id 的JOIN 請求。
在此要求中,多語言的細微差別立即凸顯出來。根據 Joomla 方式,為網站的每種語言創建一個單獨的元素,並在它們之間建立關聯。因此,對於俄語 - 一篇文章。同一篇英文文章正在單獨創建。然後我們使用語言關聯將它們相互連接起來,當在 Joomla 前端切換語言時,我們將從一篇文章重新導向到另一篇文章。
這不是 JoomShopping 中的做法:所有語言的資料都與產品儲存在同一個表格中(好的)。添加其他語言的資料是透過添加帶有這些語言後綴的列來完成的(嗯...)。也就是說,我們的資料庫中不僅僅有標題或名稱欄位。但還有 name_ru-RU、name_en-GB 等欄位
Joomla JoomShopping 產品表結構片段
同時,我們需要設計一個通用的 SQL 查詢,以便可以從管理面板和 CLI 對其進行索引。同時,使用 CRON 啟動 CLI 時選擇索引語言也是一項任務。我承認,在撰寫本文時,我暫時推遲了對該問題的全面解決方案。使用我們自己的 getLangTag() 方法選擇語言,我們可以從 JoomShopping 參數中取得主要語言,也可以使用網站的預設語言。也就是說,到目前為止,該解決方案僅適用於單語言網站。目前還無法進行不同語言的搜尋。
但是,3個月後我解決了這個問題,但已經在 SW JProjects 組件的智慧搜尋插件中了。我會進一步告訴你解決方案。
同時,讓我們看看JoomShopping發生了什麼事
我們創建了一種從 Joomla 查詢資料庫的方法,並了解了很多關於智慧搜尋外掛程式如何運作的知識。
在下一篇文章中,我們將建立一個索引內容的方法並完成插件的建立。我們也將熟悉索引項如何儲存在資料庫中,並理解為什麼這很重要,並透過多語言的非標準實作解決多語言元件的索引內容問題。
以上是Joomla 藝術中智慧搜尋的剖析 創建插件 I.的詳細內容。更多資訊請關注PHP中文網其他相關文章!