创建一个最基本的组件需要5个文件
site/hello.php 这个是组件的入口
site/controller.php 控制器
site/views/hello/view.html.php 视图,它将接受显示所需要的数据,并把数据传递给模板文件
site/views/hello/tmpl/default.php 模板文件
hello.xml 这个文件将告诉 Joomla! 如何安装这个组件
PS:site在这里是固定写法,在组建安装后,他会被自动替换为对应的组件名,比如:如果我们的组件叫hello,那么site在安装后就会被替换为com_hello。
我们总是通过一个入口访问Joomla!——在页面这边是index.php,在后台管理端是administrator/index.php。这里这个index.php是Joomla!的文件,而不是组件的一部分,我们通过这个文件来访问我们的组件,形如:
index.php?option=com_hello&view=hello
在地址栏里输入这个地址就会访问我们组件的入口components/com_hello/hello.php
下面是入口文件样例(代码来自Joomla!官方网站)
<?php /** * @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' ); // JPATH_COMPONENT:当前组件所在位置 DS:分隔符(/ 或者 /),会根据不同的操作系统使用不同的分隔符 // Require specific controller if requested if($controller = JRequest::getWord('controller')) { // getWord命令可以得到地址栏里面的参数信息 $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::getWord( 'task' ) ); // Redirect if set by the controller $controller->redirect();
第一句是安全检查,如果不符合当前安全要求的,比如没有访问权限,页面不能访问
JPATH_COMPONENT 是当前组件的路径,在这个例子中是components/com_hello。如果是管理端,则用JPATH_COMPONENT_ADMINISTRATOR。
在controller创建文成后,就要使用它来执行任务了。可以通过在地址栏输入地址来制定要执行的任务,形如:URL: index.php?option=com_hello&task=sometask,如果并没有指定任务,那么将默认执行任务display。
注意:文件结束部分并没有使用标签 ?>来结束文件。从Joomla!1.5以后,所有的纯php文件都将如此。这样做的目的是为了避免生产不必要的空格(希望有一天能明白为啥会这样)
创建控制器 site/controller.php
<?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(); } }
由于这个例子要求的非常简单,所以只有一个任务——说hello
除非制定了别的任务,JController总是会在构造函数中注册display任务。display是JController的默认任务。
创建视图
视图的任务非常简单——获取到要被现实的数据,并把数据传送给显示模板。传送数据的方法是JView::assignRef。(注意:assignRef的第一个参数不能以下划线开头,例如:$this->assignRef('_greeting',$greeting),如果这样做了,那么assignRef将会返回false或者数据不能被传送到模板中去。)
示例代码:(site/views/hello/view.html.php)
<?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); } }
创建模板
在Joomla!里,模板是把从试图传送过来的数据按照模板规定的样式显示出来。模板就是一个php文件。在模板里使用$this->{propertyname}来访问从视图传送过来的数据变量。
在本示例中,模板非常简单
site/views/hello/tmpl/default.php
<?php // No direct access defined('_JEXEC') or die('Restricted access'); ?> <h1><?php echo $this->greeting; ?></h1>