撰寫Joomla! 1.5元件的幾個重點
客戶使用的Joomla! 1.5有個要與其他非MySQL資料庫整合的需求,簡單說就是要在Joomla!的網頁裡顯示來自別的資料庫的資料內容,看似簡單的需求但牽涉到下列幾項關鍵要點:
- 資料庫不是MySQL,與Joomla!系統分屬不在一處的兩部主機
- 需要資料分頁,必須使用Joomla!預設的分頁
- 需要即時存取而不能用排程轉檔的方法
由於第3點條件的限制,就必須以Joomla!架構來撰寫,因而開始了這場Joomla! Components的奮戰歷程,除了要了解Joomla!的系統架構、它的元件組織方法、如何與現有環境整合等,實在是吃足苦頭,但追根究底最主要的障礙還是對於PHP語言與它的環境的不熟悉,只能邊做邊測邊學了。
Joomla! MVC架構
Joomla! 1.5是很標準且嚴格的MVC架構,要添加的元件程式必須符合它的MVC架構(說是限制也可以...),元件從檔名、類別名稱到資料夾名稱都有規定,要一個一個把這些檔案與資料夾都組織好可是要花不少時間,幸好有線上網頁能協助我們產生基本的元件架構:
- 產生Joomla!元件的網站:Joomla component creator
- 網址:http://www.notwebdesign.com/joomla-component-creator/index.php
在此網站填好需要的欄位後就能下載元件檔案(假設填入的元件名稱是test,則元件安裝檔名就是com_test.zip,安裝後的資料夾就在components/com_test),再利用這個檔案就能將之安裝到Joomla!系統裡。
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連結
##
您可能也會有興趣的類似文章
- Joomla! 1.0.12網站建置 (多圖) (1則留言, 2008/06/22)
- Joomla! 1.0的系統目錄結構 (0則留言, 2008/06/28)
- JEvents中文化修改 (0則留言, 2008/06/20)
- Joomla! 1.0.12網站建置2-安裝佈景主題樣板(多圖) (20則留言, 2008/07/05)
- 解決Joomla! 突然出現的鎖定圖示 (0則留言, 2008/07/11)
- Joomla! 1.0.12網站建置4-啟用統計模組 (1則留言, 2008/07/06)
- Joomla! 1.0.12網站建置3-如何預覽版面位置 (0則留言, 2008/07/05)
- 安裝Joomla! 論壇元件FireBoard (7則留言, 2008/07/13)
- 在TS-109安裝TiddlyWiki與Joomla! (0則留言, 2007/11/29)
- 進階點的統計元件:JoomlaStats (0則留言, 2008/07/13)
- WordPress 3.0與PHP 5的時區問題 (1則留言, 2010/06/24)
- 用Piwik建立自己的Google Analytics網站流量分析服務 (2則留言, 2010/08/06)
- [WordPress] 顯示網頁的資料庫查詢次數與執行秒數 (0則留言, 2008/12/20)
- [WordPress] 在插頁寫PHP的外掛:EXEC-PHP,讓行動版網頁顯示訪客統計 (0則留言, 2009/11/22)
- Resin 3.0.18與其PHP引擎 (0則留言, 2006/02/26)
Sorry, 很久沒用Google sc…