会员登录

联系我们

电话:18921289006

传真:0510-88804819

EMAIL: 这个 E-mail 受所垃圾邮件程序保护,您需要启用 JavaScript 才能查看。

开发手记

开发一个基于MVC模式的简单的组件一

打印 Email

在joomla!里,实现一个MVC模式的组件需要用到JModel, JView and JController类,在这个简单的组件我们需要五个文件:

  • hello.php - 这是组件的入口
  • controller.php - 这个文件包含了基本的控制
  • views/hello/view.html.php -这个文件将必要的数据发布到模板上
  • views/hello/tmpl/default.php - 这是输出的模板
  • hello.xml - 这个XML文件是用来安装组件.

组件入口文件必须和组件同名,如果你将你的组件命名为:kaka,安装该组件时,joomla将在组件文件夹里新建一个com_kaka的文件包,而里面也必须有kaka.php文件,否则将不会起作用.注意不要使用特殊字符如下划线来命名你的组件名和里面的文件名.
建立一个入口文件
joomla!都是通过一个单独的入口文件访问:前台应用是通过/index.php,后台是administrator/index.php,然后再载入组件,以一个'opition' 的值在URL和POST提交的数据里.例如这个组件的URL就应该是:

index.php?option=com_hello&view=hello

这个URL将载入该组件的主体文件,该组件唯一的入口文件:components/com_hello/hello.php.
该文件的典型代码如下:

<?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
*/
//安全检查 defined( '_JEXEC' ) or die( 'Restricted access' ); // 载入一个控制器文件 require_once( JPATH_COMPONENT.DS.'controller.php' ); // 检查是否需要特定的控制器 if($controller = JRequest::getWord('controller')) { $path = JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php'; if (file_exists($path)) { require_once $path; } else { $controller = ''; } } // 建立一个控制器 $classname = 'HelloController'.$controller; $controller = new $classname( ); // 完成请求任务 $controller->execute( JRequest::getVar( 'task' ) ); // 页面转向 $controller->redirect();


第一步的声明是用来安全检查的. 如果就可以保证只能从joomla的index.php入口文件访问,而直接访问将被禁止.
JPATH_COMPONENT是现在的组件的绝对路径,这里表意为components/com_hello, 如果你要特定的用到前台组件或者后台组件,可以分别使用 JPATH_COMPONENT_SITE和JPATH_COMPONENT_ADMINISTRATOR.
DS 是你系统的分隔符:  '/' 或者是 '\'. 这是自动设置的,所以开发者不必担心网站所在的服务器操作系统不同分隔符不同的问题. DS 一般都是用在涉及到服务器上某个文件时.
在载入控制器文件后,检查是否需要特殊的控制器,在这个组件里,目前只有一个控制器,这里设置目的是以备不时之需.
JRequest:getVar() 在URL或POST数据里寻找变量. 因此如果我们的URL是index.php?option=com_hello&controller=controller_name, 我们可以使用: echo JRequest::getVar('controller');在组件得控制器的名称.
现在我们有了基本的控制器HelloController在 com_hello/controller.php文件里.如果需要可以再添加诸如:HelloControllerController1的控制器到com_hello/controllers/controller1.php.使用{Componentname}{Controller}{Controllername}'这个标准的命名方法将使N多事变的容易起来.
在控制器建立后,我们命令控制器执行任务,像这样在URL里面定义: index.php?option=com_hello&task=sometask.如果没有任务被设置,将默认为正常的的"display"任务,当"display"开始作用,"view"变量将决定显示哪块区域.其他的一般任务如"保存,新建.......
在例如"保存"的任务被执行后, 控制器决定了转向页面,最后的指令执行了页面的转向.
入口文件(hello.php)实际是通过控制"控制器"来实现完成特定的页面请求.
注意我们没有使用关闭的php代码?>,原因是我们不想输出一些不必要的空白PHP代码,从joomla1.5开始,这成了一种约定俗成,将被使用到纯的PHP代码文件里.
建立一个控制器
这个组件仅仅只有一个任务-世界你好,因此,控制器将会非常简单,不需要任何的数据处理.仅仅是需要一个适当的显示被载入即可.在这个控制器中只有生个方法display();大部分的需要的功能都已内建进JController类,所以我们只需要调用JController::display() 方法即可.
基本的控制器代码如下:

<?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(),除非特别指定其他方法(用registerDefaultTask() 方法),这样将被设为 正常的任务. 其实在个display()方法,根本就没有必要,因为在继承了父类后,父的类的函数一起被调用了,这么 为了让你更直观的了解控制器.   JController::display() 方法决定了显示的名称和来自于页面请求的布局并且上载这个视图并设置布 当你为你的组件新建一个菜单项目时,菜单管理里面将允许管理员用菜单链接选择想要的视图和特定的布局,一个视图 通常是相关于一组数据如:一组车的清单,一辆车的信息等等,布局就如显示的方式,就如文章组件里面的,列表显示 这个组件里将将会有一个视图(view):hello,和一个布局(layout):default .

新建一个视 图 :
视图的任务非常简单,检索要被显示的数据然后将到显示到模板上即可.显示到模板使用JView::assignRef()方法.代码如下:

<?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文件用来以特定的风格来布局来自视图的数据.这些变量通过 JView::assignRef 方法进行分配,可以使用  $this->{propertyname} 从模板进行存取.(示例如下).
这个模板非常简单,仅仅是显示了一句问候语:

<?php
 
// No direct access
 
defined('_JEXEC') or die('Restricted access'); ?>
<h1><?php echo $this->greeting; ?></h1>

将以上文件全部打包压缩,建立 Creating the hello.xml 文件:
安装一个组件可以使用FTP上传文件,修改数据库表即可,而对于一般人来说,这有点困难.而这个是一个更

有效的建立一个文件夹来让JOOMLA的安装来自动安装.这个压缩的文件将包含有一个信息变量如下:

  • 组件的基本描述(例如组件名), 可选项, 描述, 版权 和许可信息.
  • 一组需要安装的文件清单.
  • 可选项, 一些附加的安装和卸载操作.
  • 可选项, 数据库的数据查询语句和根据安装和卸载的一些数据执行命令.
代码如下:
<?xml version="1.0" encoding="utf-8"?>
<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>
 这个 E-mail 受所垃圾邮件程序保护,您需要启用 JavaScript 才能查看。
 </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>1.01</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>controller.php</filename> <filename>hello.php</filename> <filename>index.html</filename> <filename>views/index.html</filename> <filename>views/hello/index.html</filename> <filename>views/hello/view.html.php</filename> <filename>views/hello/tmpl/default.php</filename> <filename>views/hello/tmpl/index.html</filename> </files> <administration> <!-- Administration Menu Section --> <menu>Hello World!</menu> <!-- Administration Main File Copy Section --> <files folder="admin"> <filename>hello.php</filename> <filename>index.html</filename> </files> </administration> </install>


还有一些文件是要被安装的,如index.html,这个文件一定要放在第一个文件夹里以防止那些人可以通过直接访问文件包来得到文件清单,如果没有该文件,一些服务器会列出文件夹的文件清单,这样就太不安全了.
这个文件可以只需包括这样一句代码如下:
<html><body bgcolor="#FFFFFF"></body></html>
显示一个简单的空白页面.