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

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

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

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

Controller

 

Model

繼承 JModelAdmin 以後,我們要務必要實作 getForm() ,透過 loadForm 幫我們讀取 xml 檔案。

 

Xml

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

 

View

 

Tmpl

若要取得 xml 整個 <fieldset> 可使用 renderFieldset(),若只想單純取出 <field> 則使用 renderField()

  • renderField(名稱, null, 預設值),若我們要編輯已經儲存的欄位,第三個參數可以設定。

 

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

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

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 即可。

php – Joomla! – 為什麼不在 view.html.php 使用 Model 呢?

因為要使用 Model 讀寫資料庫的時候,不見得會有 View 的需求,所以將 Model 初始化等等相關的自動程序,寫在 Controller 的話,可以節省重複性的程式碼片段。

例如在 controllers/xxx.phbp

 

php – 如何將 Eloquent 應用在非 Laravel Framework 或用在 Joonla! 開發中

Composer 安裝

或在 composer.json 寫入並添加你要的版本號

 

建立設定檔

Eloquent/database.php

建立資料庫設定檔。注意若在 Joomla! 中,因為不要被 Joomla! 更新系統洗掉,所以檔案位置獨立出來。在結尾看到 return ‘Illuminate\Database\Capsule\Manager’; 主要由外部替物件重新指定你喜歡的別名。

 

引用

若在 Joomla! 中使用,記得路徑加上 JPATH_ROOT。這裡使用了 class_alias() 替 Class 指定別名,我的範例使用的別名是 ‘DB’。

 

使用範例

一般環境跟 Joomla! 環境使用的方式基本上都一樣,可以很流暢的移植過來。下面介紹 CRUD 的寫法吧。其他更多的可以參考 Laravel 的介紹

一般環境

 

Joomla 環境