2009年7月16日 星期四

jommla的MVC之一

http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_1


Developgin a Model-View-Controller Component Part 1

軟體開發框架是應用程式的基礎,開發人員能夠應用開發框架進行程式開發,joomla 1.5的開發框架釋放了強大的威力,所有的joomla的程式碼都經過嚴格的檢查並及程式碼的減量,這件文件會將使用框架,開發程式的過程展示出來。

這件文件只展示了如何開發一個hello world的component,在以後的教學文件中,這套開發框架將用來開發完整及多功能的程式,以便展現joomla的MVC設計模式。


Requirements

joomla1.5以上的版本


Introduction to Model-View-Controller

component背後的觀念相當簡單,可是一旦功能不斷增加或進行使用介面的客製化,程式碼會立刻變得複雜。

Mode-View-Controller是一種軟體設計模式,可以有效的組織程式碼,分離商業邏輯及畫面的顯示邏輯,這種設計模式背後的觀念是這樣的,把商業邏輯及顯示邏輯放在不同區塊,當改變顯示邏輯的時候,就不需要修訂商業邏輯的程式碼。

MVC component由三個部份組成,底下會簡短說明,如果要更完整的了解,參閱文件最後的相關連結。

Model

model負責包裝應用程式的資料,他會提供管理、操作及存取資料的方法,在我們的範例中,model將包含新增、移除及更新資訊的功能,他也包含了抓取資料庫資料的功能,通常,底層的資料存取應該被包裝在model中,如果應用程式後端的資料儲存系統由平面文字改成資料庫,model就應該是唯一需要變動的部份,而不是view或controller。

View

view負責從model中取出資料,與使用者互動,web應用程式的view就是html頁面,view從model中抓取資料,將資料填入template中,呈現給使用者,view並不會使資料被修改,他只會顯示從model中抓來的資料。

Controller

controller負責回應使用者的需求,web應用程式中,使用者的需求就是送出需求的頁面,controller會根據使用者的要求,使適當地回應,抓取model中的資料,並將model的資料送給view,controller 並不會在model中顯示資料,他只會觸發model中的method,並將model中的資料傳送給view,以便顯示有用的資訊。


Joomla! MVC Implementation

在joomla中,MVC設計模式使用三個類別:JModel、JView及JController,如果還需要與這三個類別更多的相關資訊,請參閱API手冊。


Creating a Component

這份文件的component,只需要五個檔案

site/hello.php - component的大門(進入位置)。
site/controller.php - 基本的controller
site/views/hello/view.html.php - view檔案
site/views/hello/tmpl/default.php - 輸出的樣板檔
hello.xml – 這個xml檔告訴joomla如何安裝這個component

進入點的檔案名稱必須與component的名稱相同,例如,如果你的component叫做"Very Intricate Name Component”,在安裝時,joomla會自動建立com_veryintricatenamecomponent目錄,進入點的檔案必須命名為veryintricatenamecomponent.php ,不然,這個component就不能運作,一些特殊字元,如底線'_',在joomla中有特殊意義,必須避免在joomla的component名稱或檔案中使用這些特殊字元。

這邊的site目錄就是component目錄。


Creating the Entry Point

joomla永遠透過單一進入點執行程式:前台應用程式的index.php或是後台程式的administration/index.php,應用程式會載入需要的component,根據url或post的資料,載入相關的component。

index.php?option=com_hello&view=hello

這會載入我們的主要檔案,這可以當做component的單一入口點:components/com_hello/hello.php,這個檔案的程式碼相當有代表性。

site/hello.php(site就是components/com_hello)


/**
* @package Joomla.Tutorials
* @subpackage Components
* components/com_hello/hello.php
* @link http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_1
* @license GNU/GPL
*/

// No direct access
defined( '_JEXEC' ) or die( 'Restricted access' );

// Require the base controller

require_once( JPATH_COMPONENT.DS.'controller.php' );

// Require specific controller if requested
if($controller = JRequest::getWord('controller')) {
$path = JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php';
if (file_exists($path)) {
require_once $path;
} else {
$controller = '';
}
}

// Create the controller
$classname = 'HelloController'.$controller;
$controller = new $classname( );

// Perform the Request task
$controller->execute( JRequest::getVar( 'task' ) );

// Redirect if set by the controller
$controller->redirect();

第一行是安全性檢查。

JPATH_COMPONENT是目前component的絕對路徑,在我們的範例裡是components/com_hello,DS是系統的路徑分隔符號,不是斜線就是倒斜線,這由開發框架自動設定,開發人員不必因為轉換作業系統而去煩腦這些事。

載入基本的contorller以後,再檢查是不是還需要其他的controller ,這個component裡,我們只需要基本的controller,但這段程式碼還是留著,以後會用到。

JRequest::getVar()可以在url或post表單中接收變數,如果url是index.php?option=com_hello&controller=controller_name,我們可以在component中存取變數,如echo JRequest::getVar('controller');

現在 ,我們有了基本的controller—HelloController在com_hello/controller.php中,如果有需要, HelloControllerController1可以新增到com_hello/controller1.php中,controller的命名規則是這樣:{Componentname}{Controller}{Controllername}。

當controller建立後,controller會以url指定的網址執行工作,index.php?option=com_hello&task=sometask,如果沒有指定task,就會執行預設的task,預設的task是display,當設定為display時,變數view可以決定要顯示的內容,其他task是save, edit, new...。

controller可以重導頁面,通常一項task,如save完成後,最後一項程式敘述是最後的重導頁面。

主要進入點程式(hello.php)會將控制權交給controller,controller會執行request中指定的task。

我們並沒有在程式中使用php程式的結束符號:?>,這樣的用法可以避免,程式碼輸出時產生不必要的空白,這是joomla1.5預設的寫法,被應用到純php的程式檔。



Creating the Controller

我們的component只有一項工作—向世界打招呼,所以,controller非常簡單,不需要操作任何資料,我們需要做的就是載入適當的view,我們的controller中只有一個method:display(),大部份的功能都已內建在JController類別中,我們要做的全部事情只是呼叫JController::display()方法。

site/controller.php基本類別的程式碼如下:
/**
* @package Joomla.Tutorials
* @subpackage Components
* @link http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_1
* @license GNU/GPL
*/

// No direct access

defined( '_JEXEC' ) or die( 'Restricted access' );

jimport('joomla.application.component.controller');

/**
* Hello World Component Controller
*
* @package Joomla.Tutorials
* @subpackage Components
*/
class HelloController extends JController
{
/**
* Method to display the view
*
* @access public
*/
function display()
{
parent::display();
}

}

JController類別的建構子一定會註冊display()方法,除非用別的方法另外註冊,display會被設定為預設task。

這段程式碼中的display()方法並不必要,因為它只是呼叫parent constructor,不過,這倒是很好的線索,讓我們發現controller裡頭發生了什麼事情。

Jcontroller::display()會從request中決定view及layout,並載入view,設定layout,當你在component中建立選單,menu manager會讓administrator可以選擇view,指定layout,view是指一群資料的組合,layout決定view如何組合排列。

在我們的component中,我們只有單一的view,叫做hello,及單一的layout(default)。



Creating the View

view的工作非常簡單,他抓取要顯示的資料,再把資料送到template,資料送到template是使用JView::assignRef 方法。


site/views/hello/view.html.php的程式碼如下:


/**
* @package Joomla.Tutorials
* @subpackage Components
* @link http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_1
* @license GNU/GPL
*/

// no direct access

defined( '_JEXEC' ) or die( 'Restricted access' );

jimport( 'joomla.application.component.view');

/**
* HTML View class for the HelloWorld Component
*
* @package HelloWorld
*/

class HelloViewHello extends JView
{
function display($tpl = null)
{
$greeting = "Hello World!";
$this->assignRef( 'greeting', $greeting );

parent::display($tpl);
}
}



Creating the Template

joomla的template及layout是一般的php檔案,可以用來排列從view中傳來的資料,由JView::assignRef 方法指定的變數,可以在template中使用$this->{propertyname}變數,進行存取。

我們的template非常簡單,我們只要顯示從view中傳來的祝福語,這個檔案是site/views/hello/tmpl/default.php:


// No direct access

defined('_JEXEC') or die('Restricted access'); ?>

greeting; ?>





Wrapping It All UP – Creating the hello.xml File

你可以手動安裝component,使用ftp拷貝檔案,再手動修改資料庫,建立package,由joomla做安裝會是比較有效率的做法,package包含了不同的資訊。

基本的component描述(名稱)、版權敘述

需要拷貝的檔案

選擇性的:一個php檔案,進行安裝及反安裝的操作

選擇性的:一個sql檔案,進行資料庫資料的安裝及移除

檔案格式是xml,底下是hello.xml的檔案內容




Hello

2007-02-22
John Doe
john.doe@example.org
http://www.example.org
Copyright Info
License Info

1.01

Description of the component ...




controller.php
hello.php
index.html
views/index.html
views/hello/index.html
views/hello/view.html.php
views/hello/tmpl/default.php
views/hello/tmpl/index.html




Hello World!



hello.php
index.html







如果你仔細觀察這個檔案,你會發現需要拷貝的檔案,有一些並沒有討論到,例如index.html檔案,這個檔案是避免目錄下的檔案被全部列出,攤在使用者面前,一些伺服器沒有設定好,就會有這個問題,index.html檔案內容如下:



這是一個非常簡單的空白頁面。

另一個檔案是hello.php,這是admin section的進入點,暨然我們沒有admin section的進入點,他呈現的內容會跟index.html相同。

2009年5月20日 星期三

驚喜挪威

驚喜挪威這本書的作者是吳祥輝,整本書籍以吳祥輝的個人觀點,將台灣的狀況與挪威做對照,書籍起頭以台灣家庭常見的政黨藍綠對決起頭,結尾以挪威及台灣的親切民情結尾,整本書籍探討的不僅是挪威的狀況,也對台灣的現況做了許多的思考及研究。

書中介紹了許多挪威的歷史人物,其中有文學家、音樂家、政治人物,最讓我訝異的是著名的挪威文學家,他們的雕像佇立在挪威的市區,供許多人瞻養,這真是難得,跟台灣人愛跟政治人物沾上邊的習性,天差地別,台灣人的婚喪喜慶,總是需要政治人物來充場面,挪威人對文學家、音樂家的尊重,讓人感覺份外不同,著名的音樂家出殯時,城中一半的人口竟出門相迎,這充份展現對音樂家的尊重,國家人民的氣質跟習性大不相同。

挪威的社會福利好,物價高,挪威人的平均薪資約十八萬台幣月薪,不過東西也貴,一個漢堡要價台幣500元,搭一次電車要價200多元台幣,而且交通運輸的時間很短又很貴,不像台灣三更半夜還在發車或坐飛機,基本上只有白天才有辦法搭乘大眾運輸系統,而且只到五點多,過了這個時段,抱歉,下次請早,不然就租車吧!相較起來,台灣真是方便太多了。

挪威人似乎沒有顧客至上的概念,東西標價沒有在講折扣的,難怪他們這麼一板一眼,不像台灣價錢的彈性是可以談的,沒有定死不變的道理,無怪乎,台灣做什麼東西都講求彈性、速度,因為比較知道變通,不過這樣也可能走短線,沒有辦法建立紮實基礎。

政治上的意識型態及挪威人的個性在書上也被一一提起,作者求真求善求美的個性也在書中表露,也對台灣的政治現狀做了批判及省思,也對台灣人的國家記憶不全症做了回顧及探討,作者以自己的角度出發,對台灣現有的價值觀及生活模式做了一場深度之旅。

2009年5月19日 星期二

digitalus

http://digitaluscms.com/

這個專案是以Zend Framework及jQuery做為基礎構建的cms管理系統,整個系統的程式碼有一種熟悉的感覺,因為Zend Framework及jQuery正好是我最熟悉的兩套開發框架,Zend Framework是Zend官方團隊所維護及發展的,最能展現PHP物件導向的威力,jQuery是最受歡迎的javascript開發框架,兩者的結合正好可以當做我研究的對象。

架好後,整套系統運作很順暢,只是專案的討論區上人氣稀疏,套件中有的功能並沒有全部實做,上open source的cms網站上看,這個專案並沒有被列為cms的選擇之一,想想也對,雖然專案有Zend Framework及jQuery的加持,但功能並不完整,最嚴重的缺點,就是套件必須安裝在apache上的根目錄上,這是在開什麼玩笑,難不成為了安裝這個套件,得弄一個虛擬主機,如果以子目錄安裝,圖片都不會出現,有的功能也不能使用,這應該是路徑的問題,其實不難解決,更動的程式碼應該不會太多。

整個套件的發展潛力十足,很容易安裝,大概十分鐘就裝好了,邊看網站上的tutorial,邊操作,只須二三個小時就能上手了,功能不複雜,非常簡單易用,套件以mysql為資料庫,資料庫引擎使用innodb,這點我非常欣賞,一堆的cms都是使用MyISAM資料庫引擎,這真的不是一個好的選擇。

digitalus雖然潛力十足,但前途未明,不知道未來走向如何,拿來研究,改進自己的程式碼應該不錯,但是如果套用在上線的程式上,就太可怕了,整個套件的用法應該會再變動,程式寫法也還會做變化,先看看再說,免得被當做試驗品。

2009年5月18日 星期一

digitalus

http://digitaluscms.com/

陳瑩光老師給的網址,這個cms專案是用Zend Framework及jQuery撰寫的,看了一下程式碼,有一種熟悉的感覺,這真是太好了,不用再重頭學新的語法,過去投資的時間及精神不用新來過,本來是想用joomla來玩一些應用,不過這套專案應該會更符合需求,符合我自己的開發需求。

2009年5月17日 星期日

PHP is NOW

PHP is NOW


資料來源:

http://www.ibuildings.com/blog/archives/1554-PHP-is-NOW.html


原始作者:

Cal Evans
Director of PCE
Cal Evans
Ibuildings公司的PHP專業發展中心的主管,他已經在IT產業26年了,過去9年,專注於PHPMySQL領域。 Cal PHP書籍及文章的作者,並且在世界上許多的PHP會議場合演講, Cal 的部落格在 http://blog.calevans.com


翻譯:

羅仁治


php正在轉折點上,目前有許多的因素促使php的應用加廣加深,並把scripting language的標籤撕掉,成為企業開發時的正式工具。


許多php社群的開發者在過去幾年已經將php視為正式的開發工具,Digg, Expedia, Yahoo facebook這些公司在php的討論會議上一再證實php是一項有用的工具,另一些公司,Ladbrokes, Channel Five, Fiat, Panasonic, 以及 BBC,他們不但使用php做為系統背後的整合性程式語言,也將他應用在正式地,企業等級地交易流程系統中。在數目不斷成長地大型開發商中,php己經從為何使用的思考邏輯變成了為何不使用的問題。


開放源碼的經濟效益

許多因素的匯聚造成了這個轉折點,目前的世界經濟局勢是最大的影響因素,在泡沫經濟期間,公司很容易花費六位數或七位數的代價購買私有軟體,這可看出IT系統缺乏投資報酬率,經濟狀況好的時候,經理人依據老闆專業術語數量的平方做為採購依據,換一個有趣的方式說明,就是在經濟狀況好時,IT系統能不能跟上潮流是判斷的依據,而不是根據最低的貢獻度。


當狀況轉壞時,IT預算緊縮,新科技必須展現在公司財務報表中的貢獻度,而不是順應潮流。


在軟體經濟時代,開放原始碼及php與私有軟體相較,有許多優勢,當然,php最大的優勢就是不須授權費用,php php的延伸功能 PEAR PECL 以及以php搭建的開發框架都是免費的,暨然不用授權費,維護費及購買費用,以更少的IT預算就可以做更多事情。


即使經濟情勢呈現下滑的走勢,免費仍然不是佈署php的決定性理由,PHP有自己的方式增加附加價值,從簡單的類別庫到系統的佈署都有公司提供支援或服務,許多公司,像Zend, php|architect, NuSphere 會替別的公司或開發人員,開發須支付費用的開發工具或服務,這樣的方式,與開放原始碼公司 EllisLab, Sensio Labs Acquia 的營運方式雷同,PHP免費,不代表跟PHP相關的所有東西都是免費的,當與PHP相關的產品或服務不是免費時,公司必須決定他們的標價是不是增加了公司的價值。


這個工具變得更強大了


第二個因素是即將釋出的php 5.3版本,PHP 5.3目前在RC階段,最終版本會在2009年夏天公佈,PHP 5.3不像大部份的小改版,他是有許多新功能的大改版,PHP物件模型的改變,強化的新語法,引擎的改善,使他比之前的版本快速穩定,PHP的核心開發成員花了很多時間強化穩定度,並加強PHP引擎—Zend Engine的功能,雖然每一個新的PHP版本會帶來一些新功能,只有PHP 5.3提供有價值的強化功能。


php有許多朋友


我們提到了PHP系統,也提到了供應者的深度及廣度,然而,造成這個轉折點的另一個因素,是PHP現在開始被許多大廠支援,他們對php的成功有商業興趣,IBM釋出了WebSphere sMash (也就是大家熟知的 ProjectZero)sMash上的php是在JVM上執行的,而不是在Zend Engine上跑,sMash上的php並沒有包含所有的php延伸套件,但己經可以執行許多的重要應用,像是SugarCRM phpBB. IBM採用ProjectZero,代表對php語言的承諾及擔保,他們選擇php做為開發的語言不只代表他們對這個語言的強大信心,也對圍繞在php四周的社群投下信任票。


微軟對php的興趣每年都在增加,開始時是在2006年,對事業伙伴Zend感興趣,再來是每年發表的Microsoft Web Developers Summit都會有PHP,他們已經承諾,會讓PHPwindows上長期地健康發展,他們甚至雇用了一位全職的php核心開發人員,強化windows上的PHP,努力的成果,就是最近在FastCGI上發表的PHPPHPwindows上的成熟度就跟.netjava相同,可以用來開發各種規模的web應用程式。


Oracle長期支援PHP,了解並支援社群,鼓勵他們使用公司的旗艦產品,Oracle會透過Christopher Jones定期釋出PHP核心的函式庫或程式碼,此外,他們也會對PHP的會議提供財務或其他援助,像是即將到來的Dutch PHP Conference.就接受Oracle的援助。


最後一位但不是最不重要的一位朋友,是 Adobe 。他們援助的計畫,像是 AMFPHP Zend_AMF, PHP整合為Adobe開發工具的一部份。


結論


這三個因素相加,經濟情勢轉壞,下一個版本的強化,及大廠的支援,共同指出2009第二季到2010PHP在企業開發領域占有一席之地,PHP非常普及,穩定並有良好支援,如果你問到IT經理人,採用新科技的三個因素是什麼,他們會至少說出其中的二個原因,這是PHP的轉折點,對開發人員而言,這代表更多的機會,對IT經理人來說,這開啟了許多不可能實行的專案另一道門,不論如何,PHP時代的到來,意味著人人有機會成功並互相分享。


IbuildingsPHP的支援廠商,我們相信,回饋社群是我們的義務,他們給了我們機會站在領先地位,我們也是世界上PHP開發商的翹楚之一,不論你是才剛開始探索PHP的可能性,或是找尋一位伙伴實現這些可能性,我們希望可以和你一起奮鬥,就像是許多公司一樣。


(c) 2009 Ibuildings All rights reserved. Use by permission

2009年4月29日 星期三

人聲雜響 螢火點點

昨晚學校護士阿姨臨時召集大隊人馬,約大家晚上一起去看螢火蟲,約好的時間是六點集合,為了趕上集合時間,隨便抓了蛋糕跟玉蜀黍把肚子填飽,就趕去跟大家會合。

車上阿賢跟佩宜與佩琦一直鬥嘴,阿賢一直被虧,不過他也一直虧自己,車上真是非常熱鬧,第一站停留的竟然是晚飯的地方,我心想,天啊!我趕什麼勁,早知道一口飯都不吃,美食當前,我根本沒辦法下嚥,我已經飽了。

到目的地後,往山裡走,月光照射下,不難認路,產業道路兩旁螢火蟲一閃一滅,很多人會去抓螢火蟲,有一、二隻螢火蟲還會飛到我身上,不過都不會想把螢火蟲抓住,我只要欣賞就好了,遠遠看比較漂亮,喜歡慢慢走、慢慢看,看這些漂亮的燈火變化,聽人嬉鬧,拍照的愉悅笑聲。

2009年4月28日 星期二

放鬆

晚上跟同事一起吃飯,雖然還是一樣沈默,大部份時間都是靜靜聽著同事的喧鬧鬥嘴,可是會有一種融入人群的感覺,逃避人群太久了,這樣跟人相處讓我漸漸可以放開,尤其對面的小女生講話一直不停,有時戰火還不時會延燒到這,話語非常直接,覺得很好玩。

這個小女生非常活潑,飯後又邀大家到pub裡頭,這是我第一次到pub,裡頭燈光昏暗,她又招呼朋友快點到,她的個性大概很急吧!我是思考型的,事情總要想清楚後,計畫好後還不太敢動手,她是手機拿起來就直接按了,真是滿新奇的,十足的行動派,不知道要怎麼形容。

回到家後,樓下留下一盞燈還亮著,爸媽都睡了,坐在電腦前,心中煩躁的情緒突然消失,一些解不開的程式設計的問題都暫時拋開,有一種放鬆的感覺,真舒服。這次大概不會有任何結果,不過心頭舒服,交個朋友還不錯,原來人有時也需要一些朋友之間互相的交流,以後有時麼聚會,管他是什麼性質,只要不是打官腔的飯局,都去,才會找到情緒的出口。