2011-01-20 76 views
2

另一天與Joomla玩耍,而另一個缺點修復:)創建管理菜單項動態地的Joomla

這一次進來的管理(後端)菜單的形式。 要將項目/分項添加到這個菜單,人必須寫在一個XML文件中的菜單項,伴隨他們的組件/擴展/插件/不管。 安裝擴展程序後,joomla「生成」菜單項並將它們「存儲」在數據庫中。 實際上,通過讀取數據庫來呈現真實/有形菜單。

這有幾方面的含義:

  • 菜單是不編寫腳本
  • 菜單不是動態的;改變XML文件安裝後,將不會更新菜單
  • 項目的去除是不編寫腳本; joomla負責在您卸載擴展程序時刪除任何項目。

我有這個系統,它依賴於動態修改菜單項,但通過代碼的能力。 簡單地說,我需要的功能,我可以創造一個揮發性菜單項(即,它在會話結束時被刪除)。

要做到這一點,我有一對夫婦的準黑客:

  1. 覆蓋了全球的Joomla數據庫實例,這樣我可以把它返回假的菜單項。是根據我的需要輸出搞砸之前JFactory::$database=new MyFakeJDatabase(JFactory::$database);
  2. 攔截菜單代碼(HTML):因爲數據庫對象存儲在JFactory類的公共屬性這是可能的。這不是模板友好的,因爲最終的結果是注入html,這可能不是模板的設計目的。
  3. 通過JavaScript創建菜單項。這與模板和切換子菜單的JavaScript有關。
  4. 創建數據庫菜單項,每當我需要他們,不知何故「標籤」我的項目,使我下一次(或會話結束)刪除它們。這聽起來像是一種魅力。由於我可以緩衝菜單項,我可以在一個完整的SQL語句中創建我的菜單項。比我可以使用另一個SQL刪除標記的菜單項。 2個SQL語句在服務器上的負載可能不是很大。

您怎麼看?

編輯:我檢查joomla/administrator/modules/mod_menu/helper.php,看看我能找到一種方法來注入我的東西,希望,也許使用的Joomla的全局變量或東西,但沒有使用 - 菜單項通過讀取直接創建數據庫和渲染以及。 僅供參考我在谷歌上搜索了一段時間,沒用。

+0

#4似乎是最容易維護和更改,如果有必要。例如,如果需要在具有特定訪問級別的用戶位於特定管理頁面上時添加菜單項,則可以向組件控制器添加一些代碼以檢查訪問級別和當前頁面,然後調用SQL在模型中添加項目到數據庫中的語句。 – EmmyS 2011-01-20 16:26:22

回答

1

「正確」的方法是寫一個覆蓋核心菜單模塊來實現與你有任何來源動態菜單的附加功能的舊功能的模塊。不是特別好的方式,但這是Joomla的方式。 感謝@ircmaxell指出這個方法。

0

沒有破解似乎satifactory,安全或可維護足以實現這一點。

我中止了項目,而是通過JS將按鈕放在主儀表板中。

這對終端用戶來說非常不方便(他們仍然錯過了子項目)。但到底是什麼......這是Joomla的錯。

哦,並作記錄,我需要添加自己的自定義「頁」,類似於管理組件。你猜怎麼了?這也失敗了,所以這是另一個黑客。

希望通過1.7版本,他們[的Joomla]共垃圾的初始代碼庫。

2

有趣。我與Joomla合作多年,爲各種目的撰寫各種擴展,包括集成外部系統。我的經驗是通過查看代碼執行的基本需求來處理這些類型的情況。我總是開始問:它是UI驅動還是系統驅動?

首先,考慮如果代碼將根據用戶生成的系統事件執行。有一大堆他們,你甚至可以觸發你自己的。如果這是一項要求,那麼解決方案將需要合併插件,附加到事件。

但是,對於任何類型的動態UI內容,您都需要一個模塊。模塊都是關於顯示內容的。這些傢伙是爲用戶體驗而設計的。因此,請考慮如何管理對UI內容的訪問。哪些用戶將構成此內容的「受衆」?這由用戶組和訪問級別來控制。在你的代碼中的某個時刻,最好早一點,你將不得不檢查用戶的權利,然後修改你的代碼執行作爲迴應。謝天謝地,我發現有人已經爲我做了很多工作。怎麼樣?

查找執行你的代碼需要做的,或儘可能接近一個可能匹配的東西的延伸。整個CMS使用在Joomla上運行的擴展來構建!框架,並有數以千計的擴展可供下載。一旦你找到了它,克隆這件事。然後對其進行編輯,以便它能夠完成您所需要的操作,以及之前的操作(如果這是要求)。安裝更新的克隆,取消發佈原始文件併發布你的文件。節省很多時間。在您的要求

展望,代碼只只要有一個會話中執行。我會從一個'user'類型的插件開始。當用戶觸發登錄事件時,插件可以將動態菜單記錄作爲db記錄數組添加到會話變量中。當用戶觸發註銷或會話超時時,記錄將自行消失。然後,我會簡單地克隆「mod_menu」並讀入它在用戶會話中找到的任何記錄。我總是使用這種會話變量技術,特別是在實施分析數據收集的時候。

無論如何,我不經常發帖;但我確定希望這有助於。我很想親自看到這種類型的功能。只是沒有時間來編碼。

祝你好運!

chozyn