首頁 後端開發 php教程 Joomla 藝術中智慧搜尋的剖析 創建插件 I.

Joomla 藝術中智慧搜尋的剖析 創建插件 I.

Dec 04, 2024 pm 10:29 PM

在上一篇文章中,我們熟悉了Joomla智慧搜尋元件的功能,討論了使用CRON進行定時索引的參數和配置。讓我們開始為我們自己的插件創建程式碼。

資源清單

在開始技術部分之前,我將提到一些直接涉及主題的文章。以及一般涵蓋 Joomla 4 / Joomla 5 現代架構的插件的創建和/或更新的文章。接下來,我將假設讀者已經閱讀了它們並且通常了解如何製作工作插件對於 Joomla:

  • 創建智慧搜尋外掛 - Joomla 官方文件。適用於 Joomla 3,但大部分規定仍適用於 Joomla 4 / Joomla 5
  • 開發智慧搜尋外掛程式 2012 年 Joomla 社群雜誌的文章。
  • Nicholas Dionysopoulos 所著的《Joomla Extensions Development》一書涵蓋了 Joomla 的開發! Joomla 版本 4 和 5 下的擴充。
  • 新文件入口網站 manual.joomla.org 上的資料庫部分 - 適用於 Joomla 4 和 Joomla 5。 ## 技術部分。 Joomla 5智慧搜尋外掛的開發 智慧搜尋元件與資料提供者外掛程式一起使用,其主要任務保持不變 - 選擇資料並將其提供給元件進行索引。但隨著時間的推移,重新索引任務也落入了插件的職責範圍。在本文中,我們假設我們從管理面板手動執行內容索引。 CLI 的工作在視覺上有所不同,但其本質保持不變。

對於有經驗的開發人員,我會說搜尋插件擴展了 JoomlaComponentFinderAdministratorIndexerAdapter 類,該類文件位於 administrator/components/com_finder/src/Indexer/Adapter.php。好吧,然後他們會自己解決這個問題。此外,作為範例,您可以在 plugins/finder 資料夾中研究 Joomla 核心智慧搜尋外掛程式 - 用於文章、類別、聯絡人、標籤等。我為 JoomShopping(Joomla 電子商務組件)和 SW JProjects(您自己的帶有更新伺服器的 Joomla 擴展目錄組件)組件開發了一個智能搜尋插件,因此類名稱和一些細微差別將與它們相關聯。我將使用 JoomShopping 的範例來展示其中的大部分內容。多語言問題的解決方案是基於 SW JProjects 的範例。

智慧搜尋插件的文件結構

Joomshopping 智慧搜尋插件的檔案結構與典型的沒有什麼不同:

The anatomy of smart search in Joomla art Creating a plugin I.
Joomla 5 智慧搜尋外掛程式檔案結構

文件服務/provider.php

檔案provider.php允許您在Joomla DI容器中註冊插件,並允許您使用MVCFactory從外部存取插件方法。

插件類別文件

這是包含外掛程式主要工作程式碼的檔案。它應該位於 src/Extension 資料夾中。就我而言,插件類別 JoomlaPluginFinderWtjoomshoppingfinderExtensionWtjoomshoppingfinder 位於檔案 plugins/finder/wtjoomshoppingfinder/src/Extension/Wtjoomshoppingfinder.php 中。該插件的命名空間是 JoomlaPluginFinderWtjoomshoppingfinderExtension。

操作需要最少的類別屬性和方法集(它們可以被訪問,包括由父 Adapter 類別訪問)。

類別的最低要求屬性

  • $extension - 是元件的名稱,它定義內容的類型。例如,com_content。就我而言,這是 com_jshopping。
  • $context - 是插件的唯一標識符,它設定索引的上下文,在該上下文中將存取插件。事實上,這是插件類別(元素)的名稱。在我們的例子中,Wtjoomshoppingfinder。
  • $layout - 是搜尋結果元素的輸出佈局的名稱。顯示搜尋結果時使用此佈局。例如,如果$layout參數設定為article,那麼當您需要顯示該類型的搜尋結果時,預設視圖模式將搜尋名為default_article.php的版面配置檔案。如果找不到這樣的文件,則將使用名為 default_result.php 的佈局文件。 HTML 佈局的輸出佈局位於 components/com_finder/tmpl/search 中。但是,我們應該將佈局作為覆蓋放置在 html 模板資料夾中 - templates/YOUR_TEMPLATE/html/com_finder/search。在我的例子中,我將佈局命名為產品,檔案名稱為 default_product.phpThe anatomy of smart search in Joomla art Creating a plugin I.
  • $table - 是我們正在存取以獲取資料的資料庫中的表的名稱,例如#__content。就我而言,包含 JoomShopping 產品的主表稱為 #__jshopping_products。
  • $state_field - 是資料庫表中負責索引元素是否發布的欄位名稱。預設情況下,此欄位稱為狀態。然而,在 JoomShopping 的情況下,該欄位稱為product_publish。

類別中最少需要的方法

  • setup() :bool - 是一種用於預先配置插件、連接庫等的方法。此方法在重新索引期間(reindex() 方法)在 onBeforeIndex 事件上呼叫。此方法必須傳回true,否則索引會中斷。
  • index() : void - 是開始索引本身的方法。它從原始 SQL 查詢資料中收集所需結構的對象,然後將其傳遞給 JoomlaComponentFinderAdministratorIndexerIndexer 類別進行索引。此方法針對每個索引元素運行。方法參數是 $item - 資料庫查詢的結果,在 JoomlaComponentFinderAdministratorIndexerResult 類別中格式化。
  • getListQuery() :JoomlaDatabaseDatabaseQuery - 是一種取得索引項目清單的方法...

…這裡我們開始深入研究細節,因為 getListQuery() 方法並不是真正強制性的,儘管文件和大多數文章都討論了它。

The anatomy of smart search in Joomla art Creating a plugin I.
任何關於「複雜方案」主題的圖片都可以在這裡。

深入了解細節。索引元素的資料結構。

令人驚訝的是,有時一些資訊或想法在我們注意到並意識到之前就已經在我們身邊轉了一圈了!很多東西,在我們眼前一年多了,還沒有達到認知,需要經過多年的體驗,我們的注意力才集中到它們上。

關於 Joomla,由於某種原因,它的元件並沒有立即呈現出 Joomla 的某種通用架構特徵(儘管這是一個明顯的事實)。包括資料庫表結構層面。讓我們來看看 Joomla 內容表的一些欄位。我會保留的是,具體的列名對我們來說並不是那麼重要(你可以隨時查詢 SELECT name AS title),一個索引元素的資料結構是多少:

  • id - 自動增量
  • asset_id - #__assets 表中條目的 ID,其中儲存了網站每個元素的群組和使用者的存取權限:文章、產品、選單、模組、外掛程式和其他所有內容。 Joomla 使用存取控制清單 (ACL) 模式。
  • title - 元素標題
  • 語言 - 元素語言
  • introtext - 介紹文字或元素的簡短可見描述
  • fulltext - 項目的全文、產品的完整描述等
  • state - 負責發布狀態的邏輯標誌:專案是否已發布。
  • catid - 項目類別的 ID。 Joomla 不像其他 CMS 只有「網站頁面」。有些內容實體(文章、聯絡人、產品等)必須屬於某些類別。
  • 建立 - 專案的建立日期。
  • access - 存取權限群組id(未授權網站使用者(訪客)、全部、註冊等)
  • metakey - 元素的元關鍵字。是的,自 2009 年以來,Google 就不再使用它們。但在 Joomla 中,它們歷史上仍然存在,因為該欄位用於相似文章模組中,以使用指定關鍵字搜尋實際相似的文章。
  • metadesc - 元素元描述
  • publish_up 和publish_down - 元素開始發布和取消發布的日期。這更多的是一種選擇,但在許多組件中都可以找到它。

如果我們比較表格#__content(Joomla文章)、#__contact_details(聯絡人元件)、#__tags(Joomla標籤)、#__categories(Joomla類別元件),那麼我們會發現幾乎所有列出的資料類型都無處不在。

如果建立智慧搜尋外掛的元件遵循「Joomla方式」並繼承其架構,那麼您可以在外掛程式類別中使用最少的方法。如果開發人員決定不尋找簡單的方法而走自己的路,那麼您將不得不走困難的路,重新定義 Adapter 類別的幾乎所有方法。

getListQuery() 方法

此方法在 3 種情況下被呼叫:

  1. Adapter類別的getContentCount()方法是取得索引項目的數量(總共有多少篇文章,總共有多少個產品等)。 The anatomy of smart search in Joomla art Creating a plugin I. Joomla 智慧搜尋索引流程 您可以在偵錯模式下看到索引項目的數量。
  2. Adapter 類別的 getItem($id) 方法是透過 id 取得特定索引元素。 getItem() 方法又在重新索引期間在 reindex($id) 方法中呼叫。
  3. Adapter 類別的 getItems($offset, $limit, $query = null) 方法是取得索引元素清單的方法。偏移量和限制是根據組件設定設定的 - “捆綁”中應包含多少個索引元素。 The anatomy of smart search in Joomla art Creating a plugin I. Joomla 5 智慧搜尋設定索引器批次大小

讓我們來看看 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 等欄位
The anatomy of smart search in Joomla art Creating a plugin I.
Joomla JoomShopping 產品表結構片段
同時,我們需要設計一個通用的 SQL 查詢,以便可以從管理面板和 CLI 對其進行索引。同時,使用 CRON 啟動 CLI 時選擇索引語言也是一項任務。我承認,在撰寫本文時,我暫時推遲了對該問題的全面解決方案。使用我們自己的 getLangTag() 方法選擇語言,我們可以從 JoomShopping 參數中取得主要語言,也可以使用網站的預設語言。也就是說,到目前為止,該解決方案僅適用於單語言網站。目前還無法進行不同語言的搜尋。

但是,3個月後我解決了這個問題,但已經在 SW JProjects 組件的智慧搜尋插件中了。我會進一步告訴你解決方案。

同時,讓我們看看JoomShopping發生了什麼事

檢查點

我們創建了一種從 Joomla 查詢資料庫的方法,並了解了很多關於智慧搜尋外掛程式如何運作的知識。

在下一篇文章中,我們將建立一個索引內容的方法並完成插件的建立。我們也將熟悉索引項如何儲存在資料庫中,並理解為什麼這很重要,並透過多語言的非標準實作解決多語言元件的索引內容問題。

Joomla 社群資源

  • https://joomla.org/
  • Joomla 社區雜誌中的這篇文章
  • Mattermost 中的 Joomla 社群聊天(了解更多)

以上是Joomla 藝術中智慧搜尋的剖析 創建插件 I.的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1655
14
CakePHP 教程
1414
52
Laravel 教程
1307
25
PHP教程
1254
29
C# 教程
1228
24
在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話如何劫持工作,如何在PHP中減輕它? 會話如何劫持工作,如何在PHP中減輕它? Apr 06, 2025 am 12:02 AM

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

您如何在PHP中有效處理異常(嘗試,捕捉,最後,投擲)? 您如何在PHP中有效處理異常(嘗試,捕捉,最後,投擲)? Apr 05, 2025 am 12:03 AM

在PHP中,異常處理通過try,catch,finally,和throw關鍵字實現。 1)try塊包圍可能拋出異常的代碼;2)catch塊處理異常;3)finally塊確保代碼始終執行;4)throw用於手動拋出異常。這些機制幫助提升代碼的健壯性和可維護性。

說明PHP中的不同錯誤類型(注意,警告,致命錯誤,解析錯誤)。 說明PHP中的不同錯誤類型(注意,警告,致命錯誤,解析錯誤)。 Apr 08, 2025 am 12:03 AM

PHP中有四種主要錯誤類型:1.Notice:最輕微,不會中斷程序,如訪問未定義變量;2.Warning:比Notice嚴重,不會終止程序,如包含不存在文件;3.FatalError:最嚴重,會終止程序,如調用不存在函數;4.ParseError:語法錯誤,會阻止程序執行,如忘記添加結束標籤。

包括,require,incement_once,require_once之間有什麼區別? 包括,require,incement_once,require_once之間有什麼區別? Apr 05, 2025 am 12:07 AM

在PHP中,include,require,include_once,require_once的區別在於:1)include產生警告並繼續執行,2)require產生致命錯誤並停止執行,3)include_once和require_once防止重複包含。這些函數的選擇取決於文件的重要性和是否需要防止重複包含,合理使用可以提高代碼的可讀性和可維護性。

PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

什麼是HTTP請求方法(獲取,發布,放置,刪除等),何時應該使用? 什麼是HTTP請求方法(獲取,發布,放置,刪除等),何時應該使用? Apr 09, 2025 am 12:09 AM

HTTP請求方法包括GET、POST、PUT和DELETE,分別用於獲取、提交、更新和刪除資源。 1.GET方法用於獲取資源,適用於讀取操作。 2.POST方法用於提交數據,常用於創建新資源。 3.PUT方法用於更新資源,適用於完整更新。 4.DELETE方法用於刪除資源,適用於刪除操作。

See all articles