Hello World MVC 1 Component – frame
教程:如何创建一个MVC模式的Joomla组件(一)
Developing a Model-View-Controller Component – Part 1
Joomla 1.5的新框架为开发者解除了束缚,代码彻底的修改和整理过了。本文给出了采用新框架的开发过程。
我们将开发一个hello world的组件,接下来的教程中,在这个简单框架的基础上将展现MVC设计模式的力量。
MVC模式
尽管这个组件非常简单,可是随着添加新的功能或者自定义界面,代码可以非常复杂。
MVC就是数据表示和商业逻辑分开的软件设计模式,这样的前提就是商业逻辑在一起,而界面和用户交互能够被自定义或者修改而不会改变盛业逻辑的程序。
一个MV自建有三个主要的部分,这里做了简要说明,更加详细的解释请看本教程给出的参考连接诶。
Model
model 封装了应用的数据,同时提供了管理和操作数据的功能。在例子中 model 包含了add, remove and update数据库中的greeting信息,同时包含了从数据库返回greeting的list. 通常来说数据的访问英爱封装在model中,这样加入系统从一个文件数据系统中迁移到一个数据库中,那么仅仅需要修改model,而view和 controller都不必修改。
View
view 是组件的一部分,用来以一种适合用户交互的方式来组织和展示数据。对于web应用,通常view就是html页面,view从model获得数据,并传递给模板。view不做任何的数据修改,他仅仅是展示从model获得的数据。
Controller
controller负责用户的操作,对于一个web应用,一个用户的操作就是页面的请求,controller根据请求决定调用合适model并传递数据到view。
Joomla! MVC
Joomla实现了MVC模式,主要包括以下三个类 JModel, JView,JController. 更详细的信息请参考api文档.
教程:如何创建一个MVC模式的Joomla组件(二)
创建组件
对于这个简单的组件,只需5个文件:
hello.php – 组件的入口文件
controller.php – controller基类
views/hello/view.html.php – 返回数据,传递给模板
views/hello/tmpl/default.php – 模板文件
hello.xml – 组件安装文件
创建入口文件
Joomla! 总是有一个单一的如楼,比如对于站点应用是/index.php,而对于管理应用是/administrator/index.php,根据URL或者 POST数据中option参数,来决定载入必要的组件。我们开发的这个组件的入口:index.php?option=com_hello& view=hello
这就会载入我们的主文件,也就是组件的入口文件 components/com_hello/hello.php.
以下的代码对于所有的组件是相当典型的:
<?php
/**
* @package Joomla.Tutorials
* @subpackage Components
* components/com_hello/hello.php
* @link http://dev.joomla.org/component/option,com_jd-wiki/Itemid,31/id,tutorials:modules/
* @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 当前组件的绝对路径, 对于这个组件是 components/com_hello.
DS 是系统目录分隔符: ‘/’ 或 ‘\’,由系统自动设置,从而开发者不必担心系统和版本的问题。
在controller载入后,要检查是否有特别的controller需要载入。本例中没有,但是我们保留以备后用。
JRequest::getVar() 是获取get或post的数据. 如果url: index.php?option=com_hello& controller=controller_name,JRequest::getVar(’controller’)就可以返回controller 的名字;
controller命名规则是‘{Componentname}{Controller}{Controllername}’
创建了controller后, 就要执行任务,url: index.php?option=com_hello&task=sometask. 如果没有指定task,那么就执行display,这时view决定显示什么。
controller可以转向, 比如保存任务完成后. 最后一行程序就是监测转向.
教程:如何创建一个MVC模式的Joomla组件(三)
创建 Controller
组件例子只有一个任务 – greet the world. 因此controller非常简单. 不需要数据操作,所做的只是决定调用那个合适的view. 我们只有一个方法 display().
以下是源代码:
<?php
/**
* @package Joomla.Tutorials
* @subpackage Components
* @link http://dev.joomla.org/component/option,com_jd-wiki/Itemid,31/id,tutorials:modules/
* @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() 任务,除非用 registerDefaultTask() 指定默认任务,否则dislpaly作为默认的任务。
事实上这里调用display也不是必须的,因为display仅仅是调用父类的display。
JController::display() 确定合适的view和模板,并且载入他们。
例子组件中,我们只有一个view,hello,一个模板default.
教程:如何创建一个MVC模式的Joomla组件(四)创建 View
view的工作很简单,就是获取数据,用assignRef传递给模板。
view 代码如下:
<?php
/**
* @package Joomla.Tutorials
* @subpackage Components
* @link http://dev.joomla.org/component/option,com_jd-wiki/Itemid,31/id,tutorials:modules/
* @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);
}
}
?>
教程:如何创建一个MVC模式的Joomla组件(五) 创建模板
Joomla! 模板使用用来以特定方式布置从view获取数据的php文件 在模板中可以 用$this→{propertyname}获取view通过assignref传递的数据。
例子中模板非常简单,以下是代码:
<?php // no direct access
defined(‘_JEXEC’) or die(‘Restricted access’); ?>
<h1><?php echo $this->greeting; ?></h1>
教程:如何创建一个MVC模式的组件(六) 创建 hello.xml
打包 – 创建 hello.xml
可以通过上传文件,然后修改数据表来安装组件。更有效的方式是创建一个安装包,让Joomla installer帮你做安装。 这个安装文件包含以下内容:
组件的基本信息
要拷贝的文件
执行安装和卸载的php文件.
sql语句
xml文件格式如下:
<?xml version=”1.0″ encoding=”utf-8″?>
<!DOCTYPE install SYSTEM “http://dev.joomla.org/xml/1.5/component-install.dtd”>
<install type=”component” version=”1.5.0″>
<name>Hello</name>
<!– The following elements are optional and free of formatting conttraints –>
<creationDate>2007 02 22</creationDate>
<author>John Doe</author>
<authorEmail> john.doe@example.org</authorEmail>
<authorUrl>http://www.example.org</authorUrl>
<copyright>Copyright Info</copyright>
<license>License Info</license>
<!– The version string is recorded in the components table –>
<version>Component Version String</version>
<!– The description is optional and defaults to the name –>
<description>Description of the component …</description>
<!– Site Main File Copy Section –>
<!– Note the folder attribute: This attribute describes the folder
to copy FROM in the package to install therefore files copied
in this section are copied from /site/ in the package –>
<files folder=”site”>
<filename>index.html</filename>
<filename>hello.php</filename>
<filename>controller.php</filename>
<filename>views/index.html</filename>
<filename>views/hello/index.html</filename>
<filename>views/hello/view.html.php</filename>
<filename>views/hello/tmpl/index.html</filename>
<filename>views/hello/tmpl/default.php</filename>
</files>
<administration>
<!– Administration Menu Section –>
<menu>Hello World!</menu>
<!– Administration Main File Copy Section –>
<files folder=”admin”>
<filename>index.html</filename>
<filename>admin.hello.php</filename>
</files>
</administration>
</install>
你可能注意到了文件index.html,文件主要是浏览目录的时候显示这个文件,而不是显示目录下的文件结构。这个文件仅仅包含一行:
<html><body bgcolor=”#FFFFFF”></body></html>
就是一个空白页面
另外一个文件是 admin.hello.php file,这是管理组件的入口,目前我们没有这部分内容,所以他的内容和index.html内容相同