撰寫Joomla! 1.5元件的幾個重點

客戶使用的Joomla! 1.5有個要與其他非MySQL資料庫整合的需求,簡單說就是要在Joomla!的網頁裡顯示來自別的資料庫的資料內容,看似簡單的需求但牽涉到下列幾項關鍵要點:

  1. 資料庫不是MySQL,與Joomla!系統分屬不在一處的兩部主機
  2. 需要資料分頁,必須使用Joomla!預設的分頁
  3. 需要即時存取而不能用排程轉檔的方法

由於第3點條件的限制,就必須以Joomla!架構來撰寫,因而開始了這場Joomla! Components的奮戰歷程,除了要了解Joomla!的系統架構、它的元件組織方法、如何與現有環境整合等,實在是吃足苦頭,但追根究底最主要的障礙還是對於PHP語言與它的環境的不熟悉,只能邊做邊測邊學了。

Joomla! MVC架構

Joomla! 1.5是很標準且嚴格的MVC架構,要添加的元件程式必須符合它的MVC架構(說是限制也可以...),元件從檔名、類別名稱到資料夾名稱都有規定,要一個一個把這些檔案與資料夾都組織好可是要花不少時間,幸好有線上網頁能協助我們產生基本的元件架構:

在此網站填好需要的欄位後就能下載元件檔案(假設填入的元件名稱是test,則元件安裝檔名就是com_test.zip,安裝後的資料夾就在components/com_test),再利用這個檔案就能將之安裝到Joomla!系統裡。

Joomla-mvc

Joomla!的MVC以controller.php來控制不同的models與views,所有的資料存取(也就是SQL操作)都要寫在model裡,而顯示的網頁就由view來呈現。一開始不熟悉Joomla!程式時,可以參考功能比較簡單的com_newsfeeds,待熟悉點後再研讀最複雜的com_content。

Model的撰寫要點

  • 元件的Model要放在元件資料夾components/com_test/models裡
  • 不同的資料操作就提供不同的PHP程式,因為我需要的是清單格式與單篇文章格式,因此比照預設的com_content使用category.php(清單資料操作)與article.php(單篇文章操作)
  • category.php主要改寫getData(),將預設的$db =& JFactory::getDBO();資料操作寫法改
    成ODBC的寫法,例如:
  function getData()
  {
    if ($this->_debug) echo 'getData 
'; // Lets load the content if it doesn't already exist if (empty($this->_data)) { if (empty($this->_conn)) { $this->_conn = odbc_connect('Driver={SQL Server Native Client 10.0};Server=localhost;Database=MyDatabase', 'sa', 'password'); if (!$this->_conn) { echo "在 odbc_connect 有錯誤發生" . $this->_conn; } } $query = $this->_buildQuery(); $this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit')); $this->_total = odbc_num_rows($this->_cur); odbc_close($this->_conn); $this->_conn = null; } return $this->_data; }
  • 取資料的getList與loadObjectList method大致如下:
 
  function &_getList($query, $limitstart = 0, $limit = 0)
  {
    if ($this->_debug) echo '_getlist
'; $result = $this->loadObjectList($query, $limitstart, $limit); return $result; } function loadObjectList($query, $limitstart, $limit) { $this->_cur = odbc_exec($this->_conn, $query); $array = array(); $count = 0; $this->_count = 0; while ($row = odbc_fetch_object($this->_cur)) { $count++; $this->_count++; if ($count >= $limitstart && $count <= $limitstart + $limit) { // 來源資料是BIG5編碼,必須轉換為UTF-8編碼 $row->TITLE = iconv('Big5', 'UTF-8', $row->TITLE); $array[] = $row; } //if ($count > $limitstart + $limit) break; } return $array; }
  • article.php的寫法類似,只是把多筆記錄改成單筆記錄就可以了。
  • 用 $id = JRequest::getVar('id', 0, '', 'int'); 取出單筆記錄的ID,用來查詢出要操作
    資料。

View的寫法要點

  • 元件的View要放在元件資料夾components/com_test/views裡
  • 不同的view要再建立子目錄,因此會有components/com_test/views/category與
    components/com_test/views/article兩個資料夾
  • 子目錄裡依顯示的格式再產生view.html.php,用來控制HTML網頁的處理
  • 最後要呈現到瀏覽器的網頁則為components/com_test/views/category/tmpl裡的樣版檔
    • 網頁表頭部份是default.php
    • category的清單網頁則是default_items.php
    • 用 foreach ($this->items as $item) 就能取出Model建立的每筆資料物件

參考

  • Mastering Joomla! 1.5 Extension and Framework Development:Amazon連結

##

您可能也會有興趣的類似文章

簡睿

服務於軟體業的資訊老兵。興趣廣泛,學習力佳,樂於分享所知所學。

您可能也會喜歡…

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *