php – Joomla! – 登入與取出使用者資料的方法

以下使用原始含 namespace 名稱。

登入

  • \Joomla\CMS\Factory 或 JFactory

 

開發時檢查使用者是否存在

  • \Joomla\CMS\User\User 或  JUser

若在後台開發,要取得當前登入的使用者也可以使用

 

 

php – Joomla! 在 xml 中自訂欄位

參考來源

範例元件名稱 com_todolist

添加我們自訂的 xml

  • name=”clickme” 名稱是作為 tmpl 渲染使用,代表你的欄位叫什麼名字。
  • type=”mybutton” 會去尋找 models/fields/mybutton.php

 

自訂欄位的物件邏輯

我們要自訂一個類型叫做 mybutton 的 HTML <button> 元件。

  • JFormFieldMybutton 為 JFormField{首字大寫你的類型名稱}
  • $type 設定首字大寫你的類型名稱
  • 務必指定 protected function getInput(),這是為了覆寫 JFormField 的方法。

 

在 tmpl 中渲染

 

php – Joomla! 如何在 View 中使用 xml 的欄位

Joomla! 提供了許多類型的表單元件,不過官方網站文件幾乎找不到。在沒有使用 xml 表單元件的時候,我們可能會這樣寫

這樣寫也可以正確的提交表單,但如果我們想要連結 Joomla 的提供功能,例如選取註冊會員、挑選已上傳的圖片、挑選已發佈的文章,像這類屬於套件的功能,我們不打算從頭自己刻一個吧?那多累呀,於是我們可以在 Model 的地方動些手腳,讓這些表單元件顯示的方式,是透過 xml 定義。

我們看後台(administrator)範例,元件名稱叫做 com_todolist,打算挑選已經上傳的圖片--在這之前你必須要先對如何設計 Joomla! 的元件 (Component)有一定的瞭解。

Controller

 

Model

  • 繼承 JModelAdmin 以後,我們要務必要實作 getForm() ,透過 loadForm 幫我們讀取 xml 檔案。
  • 如果要在前台使用 xml 欄位設定,那麼要繼承 JModelForm 而不是 JModelAdmin。
  • JModelAdmin 繼承 JModelForm ,而定義 getForm() 實作則是在 JModelForm 。
  • JModelForm 是 libraries/src/MVC/Model/FormModel.php 的 Joomla\CMS\MVC\Model\FormModel 別名,在 libraries/classmap.php 中有定義。這是為了日後 (我想是 Joomla! 4) 將改用 namespace 的形式鋪路。目前前綴用法已經不符合 PHP 趨勢,只是相容 PHP 5 舊系統而採用。

Xml

fieldset 的 name 是我們自訂的,用於我們想要一次取得多筆欄位的時候可以呼叫對應。field 的用法可以參考官方列表,我們 name 自訂為 imageurl、 type 指定為媒體、directory 設置打開後的起始路徑。

 

View

 

Tmpl

若要取得 xml 整個 <fieldset> 可使用 renderFieldset(),若只想單純取出 <field> 則使用 renderField()。另外經由 Joomla! 產生的 <input> 等等元件,名稱會用 jform[] 陣列包裝起來喔。

 

這樣就完成畫面了,我們從瀏覽器應該可以看到挑選圖片的表單元件

點擊選擇後,可以出現視窗

php – Joomla! 前後台元件 (Component) 共用 Model 的方法

Joomla! 的元件 (Component) 在前後台算是各自獨立,而 MVC 架構更是前後台分離。也就是如果前台的 Controller 要使用後台的 Model 該怎麼辦呢?會有這個需求,主要是解決避免重複造輪子。例如

  • 前台:會員發佈文章,需要寫入資料表 Article 欄位 title, content, user_id
  • 後台:管理員可以手動發佈文章,需要寫入資料表 Article 欄位 title, content, user_id

我們發現同一件事情,寫入資料表欄位 這個動作,通常我們會在前台、後台的 Model 都要各做一次一模一樣的方法。

我們要如何統一寫一次就好,讓這個 insert() 可以被前後台都使用呢?

用範例解決方式

我建議將元件 Component 的 Model 部分,集中在後台 MVC 架構裡。前台的 MVC 架構,不要放任何的 Model。這樣可以更方便維護,日後前台、後台只要動到跟資料庫有關的行為,一律到後台的 Model 尋找

  • Component 名稱 com_my
  • Controller 名稱 MyControllerArticle
  • Model 名稱 MyModelArticle

後台控制器

取得 Model 的方法不用做任何改寫。

 

前台控制器

因為前台沒有 Model 了,我們要用 JModelLegacy::addIncludePath() 取得後台的 Model,然後仍然可以維持使用 getModel() 的方法。

 

當前後台都改用這種方式運作,我們維護與資料表 Article 的行為,就可以統一集中在後台的 Model 囉。

 

php – Joomla! 在後台添加表格排序

後台元件開發中,參考在 <table> 中的標題使用
JHtmlGrid::sort($title, $order, $direction = “asc”, $selected = 0, $task = null)

  • title 要顯示給使用者看的名稱
  • order 提交給 Server 要排序的欄位名稱,例如點擊 es_email 以後,下面提交為  [filter_order] => es_email [filter_order_Dir] => desc
  • direction 目前顯示的狀態是 asc | desc
  • selected 所選的排序,其實我不知道是幹嘛,所以填寫 0 ,如果知道的朋友歡迎留言給我
  • $task 你要前往的任務,預設是同張頁面,我喜歡寫明確一點方便維護

form 務必添加隱藏欄位 filter_order, filter_order_Dir 給 Joomla! 使用

這樣按下標題以後,就會透過 Form 的 POST/GET 送出到指定的 task 。再配合 SQL 的 Order By 即可。