1.5 组件开发基础

本文讲述一个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; 

} 

}
posted @ 2015-08-27 22:21  codergma  阅读(243)  评论(0编辑  收藏  举报