本文讲述一个Joomla组件是如何工作的以及组件的结构(组织方式),实际我们在创建组件的时候都是通过zip包安装的,
zip包可以是通过第三方工具生成的,也可以是自己打包的,但是推荐使用第三方工具生成,既方便又不易出错。第六节
讲述了怎么自己打包一个组件。
1. 在此之前先添加一个组件
通过网站http://www.component-creator.com/zh_cn/component/combuilder/components可以定制自己的组件。定制完成之后生成一个zip包,在网站的后台安装就行,
安装完成之后在components目录和administrator/components下生成一个以组件名命名的目录。
2. How a Component Work
我上面安装的组件名字叫com_followed,在com_followed目录下会有一个文件followed.php,称之为
基本文件。
当我请求 url=/components/com_followed/followed.php时,MVC模型将会经过两步 :
MVC首先找这个文件,如果找到了就注册一个类,否则失败。
假如我没有使用工具创建组件,那么实际上要经过下面几个步骤.
首先创建目录com_followed
(1) 创建基本文件 com_followed/followed.php
(2) 创建控制器文件com_followed/controller.php
控制器文件controller.php可以放在任何地方,但是习惯性放在com_followed目录下,这样就与follow.php
在同一个目录下,方便包含文件。
在followed.php中 require_once(JPATH_COMPONENT.'/controller.php'); JPATH_COMPONENT是包含
基本文件followed.php文件的目录。
在controller.php中引用library: jimport(' joomla.application.component.controller ');
创建控制器类, 随便你叫什么名字,但是习惯上是这样命名class FollowedController extends JControllerLegacy{
}
到现在为止,你拥有了两个文件base file 和 controller file。base file载入控制器,controller file定义了一个类。
下面的工作是创建这个类的对象并让他工作。
在base file(followed.php)中加入以下代码:
$controller = JControllerLegacy::getInstance('Followed'); $controller->execute( JFactory::getApplication()->input->get('task')); $controller->redirect();(3) 获取数据
controller->execute();试图完成一个请求,如果请求不包含task参数,将默认执行FollowedController的display()方法。
如果请求是这样的option=com_followed&task=jump,将执行FollowedController的jump()方法。
不同的task调用不同的方法。
(4)视图
当你构建一个这样的请求url="localhost:8085?option=com_followed&view=first[&task=mytask]"
(task部分可能不存在,这时候默认task=display).
根据上面的请求Joomla将会载入components/com_followed/views/first/view.html.php下的display方法。
3. 上面说的有点乱,下面总结一下
组件目录结构:
com_followed
------assets
------helpers
------controllers
------views
------models
------controller.php
------followed.php
------router.php
------index.html
controllers/models下存放对应控制器php文件
views 下存放对应视图的目录(first)
first 下新建目录tmpl存放布局文件,view.html.php 视图类
控制器说明:
控制器类文件 controller/控制器名.php
控制器类文件中基本代码
defined('_JEXEC') or die; jimport('joomla.application.component.controller');控制器类命名 组件名+Controller+控制器名
控制器类需要继承 JControllerLegacy
如果url没有task参数 默认调用display()方法。
视图说明:
视图类文件 views/视图名/view.html.php
视图类文件中基本代码
defined('_JEXEC') or die; jimport('joomla.application.component.view');视图类命名 组件名+View+视图名
视图类需要继承 JViewLegacy
如果url没有task参数 默认调用display()方法。
要显示布局文件需要调用paraent::display($tpl)方法。
布局文件:
布局文件 view/视图名/tmpl/随便什么文件名(如果url没有layout参数,默认访问default.php)
url说明:
option=com_followed 哪个组件
view= first 哪个视图(views/first)
task = jump 哪个方法()
如果有view参数则是视图中的方法;
如果没有view参数则是控制器中的方法,如果在task参数中没有指定哪个控制器,则指默认控制器(com_followed/controller.php/FollowedController类);
可以再task参数中指定调用哪个控制器中的方法 task=Followed.jump
如果没有指定task参数,默认是display方法
layout=default2 哪个布局(views/first/tmpl/default2.php 默认是default.php)
format=html/rss/... 请求的是哪个文件(比如省略的话是views/first/view.html.php, 如果format=rss,请求的就是 view.rss.php)
followed.php代码如下
<?php defined('_JEXEC') or die; //包含依赖 jimport(' joomla.application.compinent.controller'); //执行task(url参数之一) $controller = JControllerLegacy::getInstance('Followed');//得到一个实例 $controller->execute(JFactory::getApplication()->input()->get('task')); $controller->redirect();controller.php代码如下
<?php defined('_JEXEC') or die; jimporr('joomla.application.component.controller'); class FollowedController externds JControllerLegacy{ public fufnction display($cachable=false,$urlparams=false){ require_once JPATH_COMPONENT . '/helpers/followed.php'; $view = JFactory::getApplication()->input->getCmd('view',''); JFactory::getApplication()->input->set('view',$view); parent::display($cachable,$urlparams); return $this; } }