一、Joomla 结构详解
1.1目录结构
/ 根目录
/administrator 管理
/cache 缓存
/cli
/components 组件
/images 图片
/includes 核心
/language 语言
/libraries 库
/logs 记录
/media 媒体
/modules 模块
/plugins 插件
/templates 模板
/tmp 临时文件夹
images 存放作为网页内容的图片(非模板样式图片)
language 存放多种语言的描述数据
media 存放扩展程序(组件、模块、插件等)的网站上使用的文件(CSS, js, flash, 图片等)
tmp 用于存放安装和更新时产生的临时文件
cache ,tmp & logs 文件夹必须可写
1.2根目录文件
index.php 主文件;
.htaccess Apache rewrite;
robots.txt 搜索引擎的机器人文件;
web.config.txt IIS rewrite;
logo.gif 网站logo文件,很多人喜欢把logo文件放到根目录上。
1.3URL结构
url 结构根据菜单结构显示
假设 http://www.example.com/ 是根目录,那么 url 结构与菜单结构这样对应:
http://www.example.com/menu/submenu/submenu
http://www.example.com/menu/submenu/cat_id/art_id
也就是网站二级目录、三级目录等等都是菜单,其中根目录就是默认菜单,每一级目录就对应一个菜单项,每一级目录的内容就对应一个菜单项的菜单类型,菜单类型也就是页面主要内容的类型。
如果某一个菜单类型本身也是多级的内容(如一篇文章会分为分类ID和文章ID),就会显示类似于第二种的网址。
1.4 概念解释
组件:不同的系统功能。
组件内容:不同功能的组件所生成的内容。
模块:网页内容中,除去页面相关的主要内容外的其他内容,按照其类型独立分成各个模块。
1.5 常量说明
_JEXEC = 1 入口文件标记
DS = DIRECTORY_SEPARATOR 目录分隔符
JPATH_BASE Joomla 的基础目录(绝对路径)
JPATH_ROOT Joomla 根目录(与 JPATH_BASE 一样)
JPATH_SITE Joomla 网站目录(与 JPATH_BASE 一样)
JPATH_ADMINISTRATOR 管理系统目录(/administrator)
JPATH_LIBRARIES 库目录(/libraries)
JPATH_PLUGINS 插件目录(/plugins)
JPATH_THEMES 主题目录(/templates)
JPATH_CACHE 缓存目录(/cache)
JPATH_MANIFESTS (/administrator/manifests)
JPATH_PLATFORM libraries 的绝对路径
IS_WIN 是否 Windows 系统
IS_MAC 是否 MAC 系统
IS_UNIX 是否 Unix 系统
JREQUEST_NOTRIM = 1
JREQUEST_ALLOWRAW = 2
JREQUEST_ALLOWHTML = 4
注:
1. 目录常量都是绝对路径;
2. 这些常量都与文件系统有关(尤其标记蓝色的,在库文件的引用上非常有用)。
2、模板(Templates)
2.1 国内和国外CMS模板的区别
说明一下,国外和国内的CMS,对于模板的概念是不一样的。
在国内的CMS中,模板通常是按照页面类型而分的,每一种类型的页面都会有一个模板文件,如首页(index.php)、分类页(categories.php)、文章页(article.php)等,对于模块也会独立成一个模板文件。
而国外CMS的模板则不同,国外CMS的模板则是一个网站的布局,在Joomla中,模板文件只有一个(index.php)。
国内的网站,大都是首页的布局与内页的布局有些出入的,如果是这样,在Joomla的模板制作中要进行一些简单的处理,因为模板文件就只有一个。
2.2 Joomla模板的结构
在Joomla 中,页面内容可以简单的分为:页面内容=模板+组件内容+模块,Joomla高度模块化,组件内容也就是页面类型的特定内容,例如某一个页面是文章页,那么组件内容也就是文章页的主要内容,包括标题、日期、内容等。
按照现代网页的版式,一般分为头部(Head)、内容部(Content)和脚部(Footer)。
按照国内的制作习惯,头部和脚部是统一的,一般会直接把静态内容写在模板里面,如下:
<div id="header">头部所有内容</div>
<div id="content">...</div>
<div id="footer">脚部所有内容</div>
而那些动态的信息则另外调用,如下:
<div id="search"><jdoc:include type="modules" name="position-search" /></div><!-- 载入搜索模块 -->
内容部分简单分成两栏或者三栏,这样就完成了模板的设计了,如下:
<div id="content"> <div id="sidebar"></div><!-- 侧栏 --> <div id="article"></div><!-- 页面主要内容 --> </div>
按照严格的Joomla模板制作,头部和脚部的一些元素如标题、logo、描述、版权信息等都需要模块化,Joomla严格来说不允许任何HTML内容,也就是说只能是
<div id="header"><jdoc:include type="modules" name="position-header" /></div>
2.3 模板目录结构
所有模板都存放在 /templates 文件夹中,每一套模板均以单独一个文件夹来存放文件,文件夹名称要与模板定义文件的值一致。
/templates/.../ 其中一套模板的位置
/templates/.../css 存放css文件
/templates/.../fonts 存放字体文件
/templates/.../html 存放一些模块和组件的内容模板
/templates/.../images 存放图片文件
/templates/.../javascript 存放 js 文件
/templates/.../language 存放语言文件
2.4 Joomla 模板的制作
阻止直接访问
defined('_JEXEC') or die;
第一行加入这句话,模板文件只能直接访问。
调用内容
<jdoc:include type="head" />
放在<head>标签里面,输出动态的文档头信息,包括标题、关键词、描述等。
<jdoc:include type="modules" name="position-sidebar" />
模块可以放置的位置
<jdoc:include type="message" />
错误信息
<jdoc:include type="component" />
组件内容
jdoc标签 <jdoc:include type="" name="" style="" />
调用内容(组件内容、模块内容等)
1. type 属性可选值:component(组件)、head(头部)、installation(安装)、message(消息)、module(模块);
2. name和style 属性仅在 type="module" 时有效,name 指定模块的名称(必选),style指定模块的风格(可选),style可选值:(rounded,none,table,horz,xhtml,outline)。
调用数据
模板可直接访问工厂类 JFactory ,工厂类的用途很多,如:
$app = JFactory::getApplication(); //获取应用类(JApplication)对象
$doc = JFactory::getDocument(); //获取文档类(JDocument)对象
一般模板就只需要用到文档信息,所以获取 JDocument 对象很有用。
由于模板就是 JDocument 对象调用的,所以也就有 $this 指针了,$this 指向 JDocument 对象,JDocument 对象的作用非常多(后面有附录):
$this->template; //代表当前所使用的模板名称
$this->baseurl; //网站的基础路径
$headerData = $this->getHeadData(); //获取文档头数据(一些标签里的参数)
$this->setHeadData($headerData); //设置文档头数据
$this->params->get('name') //根据指定名称获取模板参数
$this->setGenerator(""); //设置或清楚生成器信息
模板的程序控制语句
<?php if(): ?>
<div></div>
<?php endif; ?>
相当于:
<?php if(){ ?>
<div></div>
<?php } ?>
用冒号代表语句段的开始,用end+关键词代表语句段的结束。
除了 if(endif) 之外,还有 for(endfor)、foreach(endforeach)、while(endwhile)。
设置首页和内页不同的结构
首页和内页的区分:当前菜单项和默认菜单项是否相等。
$menu = &JSite::getMenu(); //获取Menu对象
$isHome = $menu->getActive() == $menu->getDefault() ? true : false;
//获取活动中的ID和默认的ID,判断是否相等。
那么内容部分可以通过 $isHome 来设置分支:
<div id="header"></div> <div id="content"> <?php if($isHome): ?> //首页是不分栏的 <jdoc:include type="modules" name="position-home-content" /> //首页的模块 <?php endif; ?> <?php if(!$isHome): ?> //内页分左右两栏 <div id="sidebar"><jdoc:include type="modules" name="position-sidebar" />//侧栏 </div> <div id="main"> //主要内容栏 <jdoc:include type="message" /> <jdoc:include type="component" /> <jdoc:include type="modules" name="position-main" /> </div> <?php endif; ?> </div> <div id="footer"></div>
type="message" 用于输出组件的提示信息;
type="component" 是组件的内容,也就是菜单项的类型。
首页的背景和内页不一样,怎么办?
借助上面的 $isHome ,在 body 中输出不同的类名:
<body class="<?php echo $isHome?'home':'sub'; ?>">
由于类的优先级比标签高,所以只需要添加一个 .home 类并设置属性即可:
body{background:#CCC;}/*不需要改动原来的,这是内页的背景*/
.home{background:#FFF;}/*新添加的,这是首页特别的背景*/
.home 和 .sub 同样可以作为第一个选择限定符来给页面内的元素设置特殊的样式。
完善头部信息
有一些头部信息是没有用处的,例如:生成器信息、版权信息、基础地址信息、多余的js框架等。
//清除 <base> 标签
$this->base = "";
//清空生成器的信息,如果为空,程序就不会输出 <meta content="" name="generator">
$this->setGenerator("");
//如果是使用 HTML5 规范,那么就要对 charset 的meta 标签进行清除
unset($this->_metaTags["http-equiv"]);
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 这个标签将会消失
但要在 <head> 里面手动添加 <meta charset="UTF-8" />
//清除版权信息
unset($this->_metaTags["standard"]["rights"]);
//删除多余的css和js引用,以 2.5.4 为例:
unset($this->_styleSheets["/media/system/css/modal.css"]); //modal 的样式文件
unset($this->_scripts["/media/system/js/mootools-core.js"]); //Mootools 核心文件
unset($this->_scripts["/media/system/js/core.js"]); //Joomla 核心脚本文件
unset($this->_scripts["/media/system/js/mootools-more.js"]); //Mootools 功能扩展文件
unset($this->_scripts["/media/system/js/modal.js"]); //一个 Mootools 的图片查看插件
unset($this->_scripts["/media/system/js/caption.js"]); //未知
$this->_script = Array();
注:
如果 Joomla 系统不是位于Web服务器的根目录,则以上的路径会有所不同。
Joomla 是使用 Mootools 框架的,Joomla 的前台和后台模板都是基于这个框架开发的,如果使用的是其他的 js 框架,并且不想影响后台管理的功能,就只能从前台模板中去掉 Mootools 的引用。
2.5 模板配置文件(templateDetails.xml)
位置定义
<position>position-name</position>
配置 <config>...<config>
配置参数组 <fields name="params">...</fields>
配置参数项 <field /> or <field>...</field>
<field name="" type="" label=""description="" default="" />
name 名称,方便程序根据名称获取相应的参数值
type 表单控件的类型
label 标签名,一般用多语言变量,如 MOD_NAME_LABEL
description 描述,一般用多语言变量,如 MOD_NAME_DES
default 指定默认的value,仅在多选时有效
type 可选值:
text(文本框)、list(列表框)、radio(单选)、category(文章分类列表框)、color(颜色选择)、media(选择图片)、modulelayout(模块布局选择框)
选项 <option value="">MOD_NAME_OPT
三、语言系统(Language)
3.1语言翻译种类
1.前台显示
2.后台组件管理("组件"菜单里面)
3.后台菜单管理("菜单项类型设置")
4.安装扩展(1.7的新功能)
3.2语言翻译存放的位置
网站:/language
管理:/administrator/language
language 目录下是以语言标识符命名的文件夹
语言标识符是以“语言种类+地区”组合成语言标识符,如 zh-CN 代表简体中文(中文网)、zh-HK 代表繁体中文(香港)、en-GB 代表英语(英国)。
在语言标识文件夹下是各种语言定义文件,一般以扩展名独立一个成文件。
3.3语言翻译类型对应的文件名称
前台显示语言翻译 language/en-GB/en-GB.com_helloworld.ini
后台安装组件语言翻译 language/en-GB/en-GB.com_helloworld.sys.ini(加了个sys)
后台组件管理语言翻译 administrator/language/en-GB/en-GB.com_helloworld.ini
后台菜单管理语言翻译 administrator/language/en-GB/en-GB.com_helloworld.sys.ini(加了个sys)
3.3语言文件位置的选择
从1.7版本Joomla可以采用两种方式安装语言文件使用者可以采用一个或者另一个还可以两种复合使用。 在1.5版本中会安装在Joomla核心文件夹中(ROOT/administrator/language/ and ROOT/language/ )从1.6版本开始 所以可以将组件的语言文件安装在组件文件夹中而不是像1.6版以前那样安装在Joomla核心文件夹中(后者的语言文件不在安装文件夹内)。
所以从1.6版后 xml文件应包含以下内容:
<files>
<[...]
<folder>language</folder> // 这个文件夹下面的分层必须正确比如language/en-GB/ ... language/fr-FR/
<filename>whatever</filename>
[...]
</files>
安装的时候系统会使用扩展本身语言文件夹中的.sys.ini文件翻译显示安装信息安装完成后Joomla文件夹下的sys.ini和.ini将处于优先地位如果有的话。 这样做有两个优势一是升级的时候不会影响语言文件二是可以在扩展中同时包含多个语言文件夹而不用安装多个语言包。
3.4整合到组件文件夹中:
site/language/en-GB/en-GB.myextension.sys.ini
site/language/en-GB/en-GB.myextension.ini
admin/language/en-GB/en-GB.myextension.sys.ini
admin/language/en-GB/en-GB.myextension.ini
四、模块开发(Modules)
4.1 目录位置与结构
位置:模块文件存放在 \modules 下,以 mod_ + 模块名称作为文件夹名称独立存放。
结构:
\modules\mod_helloworld //某一个模块的目录
..\mod_helloworld.php //模块主文件
..\mod_helloworld.xml //模块定义文件
..\tmpl //模板文件夹
..\tmpl\default.php //默认模板文件
4.2 主文件
mod_helloworld.php
//禁止直接访问
defined('_JEXEC') or die;
//模块程序
...
//载入模板
require JModuleHelper::getLayoutPath('mod_helloworld', $params->get('layout', 'default'));
4.3 模板文件
default.php
//禁止直接访问
defined('_JEXEC') or die;
//内容
<div class="helloworld"></div>
4.4 定义文件
mod_buyproduct.xml
<extension type="module" version="2.5" client="site" method="upgrade"> 段
type="module" 模块定义
version="2.5" Joomla 版本
client="site" 前台模块
method="upgrade" 安装和升级
五、组件开发(Components)
5.1 组件文件
Joomla 的组件文件存放的位置有两个:
/components 网站的组件
/administrator/components 管理的组件
组件文件夹名称以 com (组件的前3个字母)加上组建名称构成,如 com_helloworld。
组件主文件以组建名称命名,如helloworld。
/com_helloworld/helloworld.php
// 检测是否正常入口
defined('_JEXEC') or die();
// 导入controller库
require_once('controller.php');
// 新建一个以HelloWorld为前缀的控制器
$controller = new MsgboardController;
// 显示组件内容
$controller->display();
5.2组件结构
Joomla 的组件开发遵循 MVC 结构,较多的情况下是一个控制器多个操作函数、一个模型多个操作函数、多个视图。
单个控制器存放在主目录下,多个控制器则放在 controllers 文件夹下;
模型存放在 models 文件夹下
以 helloworld 组件为例:
com_helloworld/
com_helloworld/models
com_helloworld/views
com_helloworld/helloworld.php
com_helloworld/controller.php
控制器就是组件功能的控制,如新建文章、修改文章、删除文章等,一般的途径就是接收 POST 数据;
模型就是数据的操作,如加密解密、更新数据库等;
视图就是显示的界面,如新建文章界面、文章列表显示界面、文章图文显示界面等。
MVC 操作的过程跟 M-V-C 排列的顺序是不一致的:
控制器C接收请求,根据不同的操作执行相应的控制函数,控制函数可能会用到模型M,执行完控制函数后就需要显示内容或者进行转向,如果是显示内容则需要把工作交给视图V来处理,视图V也可能会使用到模型M,最终会以模板的版式进行输出。常用的流程如下:
C->V->M->End 显示某一篇文章、显示某一张图片
C->M->V->M ->End 保存或删除一篇文章,并显示
C->M->Redirect 保存或删除一篇文章,并重定向(建议使用上面那一种,少用重定向)
5.3控制器
文件名以"controller.php"命名。
类名以组件名加上"Controller"命名,如 HelloWorldController。
/com_helloworld/controller.php
// No direct access to this file
defined('_JEXEC') or die();
// import Joomla controller library
jimport('joomla.application.component.controller');
/**
* Hello World Component Controller
*/
class HelloWorldController extends JController
{
function display($cachable = false){
parent::display($cachable);
}
}
组件控制器继承 JController
添加控制的函数,例如 display (显示)
这里调用了基类的 display 函数,该函数以默认的方式加载视图:
在 views 文件夹下查找以组件名字命名的文件夹(如 helloworld);
载入该文件夹里面的 view.html.php ;
创建视图对象,(如 HelloWorldViewHelloWorld);
运行视图类的 display 函数。
5.4视图
视图放在 views 文件夹里,每一个视图都独立一个文件夹,以视图名称命名,
组件视图类名称以组件名加上"view"再加上视图名构成,如 HelloWorldViewHelloWorld。
/com_helloworld/views/helloworld/view.html.php
视图模板的 $this 指向当前的视图对象,可以在视图模板中直接操作视图对象。
视图模板配置
/com_helloworld/views/tmpl/default.xml
如果该组件可以作为菜单类型添加到菜单项中,则需要添加这个配置文件。
<layout> 项:允许该组件视图添加到菜单项类型中,设置这个之后,在添加菜单项的类型中会多出一个组件视图。
<layout title="COM_HELLOWORLD_HELLOWORLD_VIEW_DEFAULT_TITLE">
<message>COM_HELLOWORLD_HELLOWORLD_VIEW_DEFAULT_DESC
</layout>
Title属性指定在“添加一个菜单项类型”对话框显示的文字;
Message 标签指定鼠标指向时显示的简要描述。
<fields> 项:设置配置菜单,该配置会出现在指定了该视图后的配置菜单中
<fields name="request"> <fieldset name="request"> <field> </field> </fieldset> </fields>
例子:
<field name="id" type="list" label="COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_LABEL" description="COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_DESC" default="1"> <option value="1">Hello World!
如果 type="helloworld" 那么就会在 /administrator/components/com_helloworld/models/fields 文件夹下去找对应的定义,这个新的域显示一个供选择信息的下拉列表。
以上的多语言语句定义需在 /administrator/language 中设定
5.6模型
载入组件模型项类(JmodelItem);
创建自定义的组件模型项类,类名以组件名+"Model"+模型名,一般地,模型名称与视图名称一致;
创建模型函数。
/com_helloworld/models/helloworld.php <?php // No direct access to this file defined('_JEXEC') or die('Restricted access'); // import Joomla modelitem library jimport('joomla.application.component.modelitem'); /** * HelloWorld Model */ class HelloWorldModelHelloWorld extends JmodelItem //1.5 是 Jmodel 2.5 是 JmodelItem { function get(){} }
5.7 MVC结合
控制器使用模型
在控制器类函数中操作,如:
function display($cachable = false){
require_once(JPATH_COMPONENT.'/models/helloworld.php'); //载入模型类文件
$model = new MsgboardModelMsgboard; //新建一个模型类对象
$model->model_func();
//使用模型函数
}
视图使用模型
在视图的 display 函数里面添加代码,同上一样。
控制器使用视图
控制器类访问 display 函数,只有网址没有 view 参数,怎会加载与组件同名的视图文件,并执行视图的 display 函数。
5.8 配置项模型
当配置项的type值等于组件名称时,Joomla会在组件的模型配置目录里找到定义。
例如:com_helloworld/models/fields
配置项模型为视图的配置项提供一个数据模型。
载入表单助手(form.helper);
根据配置项的表单控件类型,载入控件类型;
创建表单配置类,类名称以JFormField+组建名构成,继承控件类型相应的类。
例子:
<?php // No direct access to this file defined('_JEXEC') or die; // import the list field type jimport('joomla.form.helper'); JFormHelper::loadFieldClass('list'); /** * HelloWorld Form Field class for the HelloWorld component */ class JFormFieldHelloWorld extends JFormFieldList { /** * The field type. * * @var string */ protected $type = 'HelloWorld'; /** * Method to get a list of options for a list input. * * @return array An array of JHtml options. */ protected function getOptions() { $db = JFactory::getDBO(); $query = $db->getQuery(true); $query->select('id,greeting'); $query->from('#__helloworld'); $db->setQuery((string)$query); $messages = $db->loadObjectList(); $options = array(); if ($messages) { foreach($messages as $message) { $options[] = JHtml::_('select.option', $message->id, $message->greeting); } } $options = array_merge(parent::getOptions(), $options); return $options; } }
5.9 扩展配置文件
组件配置文件名,以组件名称命名(没有"com_"前缀),如admin组件是"com_admin"目录的"admin.xml"
模块配置文件名,以"mod_"前缀+模块名称命名,如mod_banner模块是"mod_banner"目录的"mod_banner.xml"
配置文件内容:
<?xml version="1.0" encoding="utf-8"?> <extension type="component" version="2.5" method="upgrade"> <extension>段,代表这是一个扩展的定义文件。 可适用语言描述表达式 XML_DESCRIPTION extension 属性: type 表示扩展的类型,component组件,module 模块 version Joomla版本 client 仅模块适用,指定"site"网站还是"administrator"管理 <extension> 子标签: <name>扩展的名称 <authorv作者,个人名称或组织名称 <authorEmail> 作者的E-mail <authorUrl> 作者的个人主页 <creationDate> 创建日期,July 2004 <copyright> 版权描述 <license> 许可协议 <version> 版本 2.5.0 <description> 描述 <install> 段,安装配置 <sql> 段,安装数据库的SQL <file driver="mysql" charset="utf8"> 指定外部SQL文件 driver 数据库驱动,mysql charset 编码 <uninstall> 段,卸载配置,同 <install> 一样 <files> 段,定义网站文件 <files folder="site"> 目录,组件时要指定 folder <filename> 文件 <administration> 段,定义管理文件 <menu> 可选,后台菜单的名称 <folder> <files folder="admin"> 组件时要指定 folder <languages> 段,设置语言 <language tag="en-GB">en-GB.mod_latest.ini 5.10组件语言设置
安装信息设定 site/zh-CN/zh-CN.com_helloworld.sys.ini
安装信息是后台安装组件时显示的信息,包括组件名称和描述等。组件名称和描述分别在组件配置文件里面的和标签中定义。
中文翻译文件例子:
COM_HELLOWORLD="世界你好!"
COM_HELLOWORLD_DESCRIPTION="一款用于组件开发测试的组件。"
英文翻译文件例子:
COM_HELLOWORLD="Hello World!"
COM_HELLOWORLD_DESCRIPTION="A component for component development testing."
注意中英文符号。
前台文字设定 site/zh-CN/zh-CN.com_helloworld.ini
凡是开发非英文扩展,都要养成一个习惯,用翻译文件存放信息。
后台管理菜单 admin/zh-CN/zh-CN.com_helloworld.ini
在管理菜单里面用到的信息也一律存放在该文件下,一般以 COM_HELLOWORLD_ADMIN_? 或 COM_HELLOWORLD_ADMIN_MENU_? 为前缀命名。
后台管理菜单类型 admin/zh-CN/zh-CN.com_helloworld.sys.ini
菜单标题为 COM_HELLOWORLD_ADMIN_MENU 这是Joomla固定的,其中HELLOWORLD代表组件名称,如果没有设定 COM_HELLOWORLD_ADMIN_MENU ,那么在后台的组件菜单中会显示 COM-HELLOWORLD-ADMIN-MENU 。
另外在菜单类型中所使用到的信息也存放在这个文件中。
5.11后台组件管理功能
工具栏
设置工具栏通过 JToolBarHelper 这个类来实现,你可以在 administrator/includes/toolbar.php 中找到其他的后台工具。
把工具栏设置封装成一个函数:
function addToolBar(){
JToolBarHelper::title(JText::_('COM_HELLOWORLD_MANAGER_HELLOWORLDS')); //标题
JToolBarHelper::deleteList('', 'helloworlds.delete');
JToolBarHelper::editList('helloworld.edit');
JToolBarHelper::addNew('helloworld.add');
}
放到控制器或者是助手类里面,其中函数里面设置的字符串会通过 $_POST['task'] 提交表单。
子菜单
与工具栏一样,封装成一个函数
public static function addSubmenu($vName){
// default menu
JSubMenuHelper::addEntry(
JText::_('COM_HELLOWORLD_ADMIN_VIEW_DEFAULT'),
'index.php?option=com_helloworld',
$vName == 'helloworld'
);
JSubMenuHelper::addEntry(
JText::_('COM_HELLOWORLD_ADMIN_VIEW_READ'),
'index.php?option=com_helloworld&view=read',
$vName == 'read'
);
}
添加子菜单函数
addEntry(name, url, active)
name 菜单的标题,通常用 JText 引用多语言定义标记
url 链接地址
active [可选]是否活动的菜单
子菜单就是设置不同的 view 参数,再由控制器根据不同的参数显示相对应的视图。
图标使用的原理:
引用特定的CSS文件,该文件一般保存在media文件夹内(/media/<component_name>/css/<css_file>.css);
图标文件保存在该CSS文件附近(../images/icon-48-logo.gif);
在CSS文件添加图标类(.icon-48-generic),设置背景指向图标文件(../images/icon-48-logo.gif)。
引用CSS文件:$document->addStyleSheet(JURI::root(true).'/media/k2/assets/css/k2.css');
助手类
存放在 helpers 文件夹里
Controller 加载 helper
如:require_once JPATH_COMPONENT.'/helpers/helloworld.php';
助手类的定义:
class HelloWorldHelper extends JController{
public static function addSubmenu($vName){} //添加子菜单
public static function addToolBar($view){} //添加工具栏
}
记得是设置 static
这样就可以在 Controller 里面直接用类名来访问了:
HelloWorldHelper::addSubmenu($view);
HelloWorldHelper::addToolBar($view);
这里是把添加子菜单和添加工具栏两个操作封装到助手类中的独立函数中。
使用工具
JHtml::_('behavior.tooltip');
引用 mootools-more.js
可以使用到后台系统的js
载入子模板
loadTemplate()
<?php echo $this->loadTemplate(art);?>
子模板跟父模板存放相同的位置,并且以父布局 default 为前缀,如 default_art.php
default.php <form action="<?php echo JRoute::_('index.php?option=com_helloworld'); ?>" method="post" name="adminForm" id="adminForm"> <table class="adminlist"> <thead><?php echo $this->loadTemplate('head');?></thead> <tfoot><?php echo $this->loadTemplate('foot');?></tfoot> <tbody><?php echo $this->loadTemplate('body');?></tbody> </table> <div> <input type="hidden" name="task" value="" /> <input type="hidden" name="boxchecked" value="0" /><?php echo JHtml::_('form.token'); ?> </div> </form>
name='task' 代表任务,当点击工具栏的按钮时,该隐藏表单项会作为按钮设置的任务表达式进行递交,如“helloworld.edit”,控制器通过获取 $_POST['task'] 来得到这个任务表达式。
name="boxchecked" 用于检查至少选择一个项目。
form.token 是一个作为隐藏表单项输出的表单密钥。
这三个都是必需的!
default_head.php
<tr> <th width="5"><?php echo JText::_('COM_HELLOWORLD_HELLOWORLD_HEADING_ID'); ?></th> <th width="20"><input type="checkbox" name="toggle" value="" onclick="checkAll(<?php echo count($this->items); ?>);" /></th> <th><?php echo JText::_('COM_HELLOWORLD_HELLOWORLD_HEADING_GREETING'); ?></th> </tr>
checkAll 是 Joomla 系统的js函数,可以选中所有的选项,在此文件内定义:
/media/system/js/core.js
该文件是Joomla系统的js核心文件
default_body.php
<?php foreach($this->items as $i => $item): ?> <tr class="row<?php echo $i % 2; ?>"> <td><?php echo $item->id; ?></td> <td><?php echo JHtml::_('grid.id', $i, $item->id); ?></td> <td><?php echo $item->greeting; ?></td> </tr> <?php endforeach; ?>
JHtml::_ 是一个帮助类函数它可以显示很多种 HTML输出本例中它将显示一个复选框。
default_foot.php
<tr> <td colspan="3"><?php echo $this->pagination->getListFooter(); ?></td> </tr>
$this->pagination 是一个 JPagination 对象,JPagination 是一个用于自动标记页码的对象
附录:常用类
平台类 JPlatform
用于存放Joomla版本的信息和特性
类成员(常量)
PRODUCT = Joomla Platform 产品名称
RELEASE = '11.x' 发行
MAINTENANCE = '0' 维护
STATUS = 'Stable' 发展现状,一般为稳定版(Stable)
BUILD = 0 建立号 Build number
CODE_NAME = 'Brian Kernighan' 代码名
RELEASE_DATE = '03-Jan-2012' 发行日期
RELEASE_TIME = '00:00' 发行时间
RELEASE_TIME_ZONE = 'GMT' 发行时间地区
COPYRIGHT = 'Copyright (C) 2005 - 2012 Open Source Matters, Inc. All rights reserved.' 版权
LINK_TEXT = '<a href="http://www.joomla.org">Joomla!</a> is Free Software released under the GNU General Public License.' 链接信息
工厂类 JFactory
信息加工的工厂
类变量(静态)
$application JApplication
$cache JCache
$config JConfig
$dates
$session JSession
$language JLanguage
$document JDocument
$acl JAccess
$database JDatabase
$mailer JMail
成员函数(静态)
getApplication($id = null, $config = array(), $prefix = 'J')
获取一个应用对象,返回公共 JApplication 对象
$id 客户端 ID 或名称
$config 配置设置,一个可选合集数组
$prefix 应用程序前缀
getConfig($file = null, $type = 'PHP')
获取配置设置对象,返回一个公共 JRegistry 对象。
$file 配置文件路径
$type 配置文件类型
getSession($options = array())
获取 Session 对象,返回一个公共 JSession 对象。v
$options 一个包含 Session 选项的数组
getLanguage()
获取语言对象,返回一个公共 JLanguage 对象。
getDocument()
获取文档对象,返回一个公共 JDocument 对象。
getUser($id = null)
获取用户对象,返回一个公共 JUser 对象。
$id 用户ID,数值或数字字符串v
getCache($group = '', $handler = 'callback', $storage = null)
获取缓存对象,返回一个公共 JCache 对象。
$group 缓存组名
$handler 处理器
$storage 存储器
getACL()
获取一个授权对象,返回一个公共 JACL 对象
getDbo()
获取一个数据库对象,返回一个公共 JDatabase 对象
getMailer()
获取一个邮件程序对象,返回一个公共 JMail 对象
getFeedParser($url, $cache_time = 0)
获取一个解析 XML Feed 的源,返回一个解析对象。
$url feed 源的 url
$cache_time 缓存时间
getXMLParser($type = '', $options = array())
获取一个 XML 文档,返回一个用于解析 XML 文档的对象。
$type 语法分析器的类型:'DOM', 'RSS' or 'Simple'
$options 当使用 RSS 时,指定 RSS 的地址
getXML($data, $isFile = true)
读取一个 XML 文件,返回 JXMLElement 对象。
$data 完整的文件路径和名称
$isFile 是否是文件(可以是文档对象和字符串)
getEditor($editor = null)
获取一个编辑器对象,返回 JEditor 对象。
$editor 要载入的编辑器,依赖于该编辑器的插件也被一同加载。
getURI($uri = 'SERVER')
返回一个参考到 JURI 对象。
$uri URI 名称
getDate($time = 'now', $tzOffset = null)
返回 JDate 对象。
$time 初始时间
$tzOffset 时间地区偏移
createConfig($file, $type = 'PHP', $namespace = '')
创建一个配置对象,返回 JRegistry 对象。
$file 配置文件的路径
$type 配置文件的类型
$namespace 配置文件的命名空间
_createConfig($file, $type = 'PHP', $namespace = '')
跟 createConfig 一样
createSession($options = array())
创建一个 Session 对象,返回 JSession 对象。
$options 包括 Session 选项的一个数组
_createSession($options = array())
跟 createSession() 一样
createDbo()
创建一个数据库对象,返回 JDatabase 对象。
_createDbo()
跟 createDbo() 一样
createMailer()
创建一个邮件程序对象,返回 JMail 对象。
_createMailer()
跟 createMailer() 一样v
createLanguage()
创建一个语言对象,返回 JLanguage 对象。
_createLanguage()
跟 createLanguage() 一样
createDocument()
创建一个文档对象,返回 JDocument 对象。
_createDocument()
跟 createDocument() 一样
getStream($use_prefix = true, $use_network = true, $ua = null, $uamask = false)
创建一个新的带有适当前缀的流对象,返回 JStream 对象。
$use_prefix 是否作为写入在连接添加前缀
$use_network 是否使用网络
$ua 使用代理人
$uamask 用户代理屏蔽
JRequest 请求类
这个类为 Joomla 平台提供一个共同的接口来访问请求变量。这包括 $_POST, $_GET, 和 $_REQUEST ,这些变量可以通过输入过滤器,以避免注射或返回原。
成员函数(静态)
getURI()
获取完整请求地址,返回字符串。
如 /515369/index.php?option=com_links&view=links
getMethod()
获取请求方法,返回字符串。
如 GET或POST
getVar($name, $default = null, $hash = 'default', $type = 'none', $mask = 0)
取得一个给定的变量。默认行为是根据当前请求的方法读取变量,GET 和 HEAD 将导致从 $_GET 返回一个条目,POST和PUT将导致从 $ _POST返回一个条目。
v您可以通过设置 $hash参数强制源:
post $_POST
get $_GET
files $_FILES
cookie $_COOKIE
env $_ENV
server $_SERVER
method 经过当前 $_SERVER['REQUEST_METHOD']
default $_REQUEST
$name 变量名称
$default 变量不存在时的默认值
$hash 变量来源
$type 返回变量的类型
$mask 变量的过滤器
getInt($name, $default = 0, $hash = 'default')
获取整型变量,参数与 getVar() 一致。
getUInt($name, $default = 0, $hash = 'default')
获取无符号整型变量,参数与 getVar() 一致。
getFloat($name, $default = 0.0, $hash = 'default')
获取浮点变量,参数与 getVar() 一致。
getBool($name, $default = false, $hash = 'default')
获取布尔值变量,参数与 getVar() 一致。
getWord($name, $default = '', $hash = 'default')
获取单词变量,过滤器为 [A-Za-z_] ,参数与 getVar() 一致。
getCmd($name, $default = '', $hash = 'default')
获取命令(包括英文和数字)变量,过滤器为 [A-Za-z0-9.-_] ,参数与 getVar() 一致。v
getString($name, $default = '', $hash = 'default', $mask = 0)
获取字符串变量,过滤器删除坏的HTML代码 ,参数与 getVar() 一致。
setVar($name, $value = null, $hash = 'method', $overwrite = true)
设置一个请求变量,参数与 getVar() 一致。
get($hash = 'default', $mask = 0)
获取请求数组,参数与 getVar() 一致。
set($array, $hash = 'default', $overwrite = true)
用数组设置请求变量,参数与 getVar() 一致。
checkToken($method = 'post')
检查请求中的令牌
clean()
从脚本清理请求
_cleanVar($var, $mask = 0, $type = null)
清理一个输入变量
_stripSlashesRecursive($value)
JApplication
成员变量
$clientId 客户端标识
$messageQueue 信息队列
$name 名称
$scope 应用程序范围
$requestTime 请求时间
$startTime 开始时间
$input 输入对象
$instances 实例容器
JToolBarHelper 工具栏助手类(抽象)
文件:/administrator/includes/toolbar.php
成员函数(静态)
title($title, $icon = 'generic.png')
设置标题和图标,图标名称以"icon-48-"加指定字符串构成,默认设置"icon-48-generic.png",图标会以最终的字符串添加到标题的CSS类里面。
最终的HTML代码为:
<div class="pagetitle icon-48-generic"> <h2>Title</h2> </div>
divider()
写一个分隔线
publish($task = 'publish', $alt = 'JTOOLBAR_PUBLISH', $check = false)
写一个公共的发布按钮(OK按钮),可用于发布、标记为已读、标记为生效等操作。
$task 覆盖的任务
$alt 按钮名称
$check 是否检查最少要选中一个列表项
JSubMenuHelper 子菜单助手类(抽象)
文件:/administrator/includes/toolbar.php
成员函数:
在子菜单添加菜单项
addEntry($name, $link = '', $active = false)
$name 名称
$link URL
$active 是否活动状态
例:
JSubMenuHelper::addEntry(
"新建",
'index.php?option=com_helloworld&view=helloworld&layout=edit',
JRequest::getCmd('view', 'helloworld')
);
菜单项名称为“新建”,通过判断view参数是否为helloworld来为菜单项设置为活动。
这篇文章来自:小文的计算机Blog
评论 (0)