xoops 系统的安装和开发模块学习

5. 系统主题开发指南

5.1. 综述

5.2. 主题对模板

5.3. 创建一个主题

5.3.1. 系统 CSS 样式文件

5.3.1.1. CSS综述

5.3.1.2. 公共的CSS

5.3.1.3. 缺省的CSS及其注释

5.4. 创建一个模板

5.5. 制作一个好的主题

5.6. Kickstart指南

5.7. 主题中的Javascript

5.7.1. 动态菜单

 

5.1 系统主题开发指南综述

作为最现代的站点, 系统的默认主题(现由Smarty带动)有一个三层模型:

1.      模块或区块模板片断(由带有Smarty引擎带动的内容标签生成)

2.      设计模板——控制设计和普通结构(被设计者等人称为'骨架'的)

3.      CSS文件——这是实际设计的地方

注意我是如何称他们"模板片断",因为你几乎从来不为一个完整的页面创建一个单独的模板,而是一小部分的html代码,像Lego区块一样彼此连接,意味着可以创建综合趣味的站点结构(它是被普遍推荐来保持一个简单的设计,为了维护的简单性)。

一个很好的例子是区块有他们自己模板的方式。站点上的不同区块产生时是有他们特殊的标题和内容的,使用区块模板,结果是依次生成另一个高层的模板。当然这个方式意味着你做不到每个区块有一个不同的设计——你的站点中的所有区块模板将使用相同的主题区块模板,但将有可能在以后的系统版本中实现。

 

总之,综述了一些事情,如果我们看加工的模版的指令,我们将会看到:

1.      得到需要在这个页面显示的区块的列表

2.      每个区块都产生html代码,并保持原来的缓冲。

3.      将这些html代码粘贴到主题区块模板中

4.      连接左边的区块的所有缓冲到一个单独的缓冲中

5.      连接中间的区块的所有缓冲到一个单独的缓冲中

6.      连接右边的区块的所有缓冲到一个单独的缓冲中

7.      通过先前准备好的缓冲,提交站点的主要主题模板到模板中

 

当你明白系统是如何工作的时候,领会系统缓存区块通过简单保存文件中的绘制模板的结果来代替每个页面访问都要从数据库中拖数据就很容易了(缓冲包括用系统的变量绘制一个smarty模板的html结果)。这种机制戏剧化的改进了系统的性能,降低了cpu的使用,导致快速的页面载入。

什么是Smarty

Smarty是一个PHP模板引擎。更准确的说,它分开了逻辑程序和外在的内容,提供了一种易于管理的方法。可以描述为应用程序员和美工扮演了不同的角色,因为在大多数情况下 ,他们不可能是同一个人。

例如,你正在创建一个用于浏览新闻的网页,新闻标题,标签栏,作者和内容等都是内容要素,他们并不包含应该怎样去呈现。在Smarty的程序里,这些被忽略了。模板设计者们编辑模板,组合使用html标签和模板标签去格式化这些要素的输出(html表格,背景色,字体大小,样式表,等等)。有一天程序员想要改变文章检索的方式(也就是程序逻辑的改变)。这个改变不影响模板设计者,内容仍将准确的输出到模板。同样的,哪天美工吃多了想要完全重做界面,也不会影响到程序逻辑。因此,程序员可以改变逻辑而不需要重新构建模板,模板设计者可以改变模板而不影响到逻辑。

现在简短的说一下什么是smarty不做的。smarty不尝试将逻辑完全和模板分开。如果逻辑程序严格的用于页面表现,那么它在模板里不会出现问题。有个建议:让应用程序逻辑远离模板, 页面表现逻辑远离应用程序逻辑。这将在以后使内容更容易管理,程序更容易升级。

Smarty唯一的方面之一是模板的编译技术。这意味着Smarty从它们读取模板文件、创建PHP脚本。一旦它们被创建,它们立即被执行。因此,没有不计代价的为每个请求分析的模板文件,而且每个模板都可以充分利用PHP编译缓存解决像Zend Accelerator(http://www.zend.com)PHP Accelerator(http://www.php-accelerator.co.uk)的问题。

Smarty的一些特点:

* 它的速度非常快。

* php分析器干这个苦差事是有效的。

* 不需要多余的模板语法解析,仅仅是编译一次。

* 仅对修改过的模板文件进行重新编译。

* 可以编辑'自定义函数'和自定义'变量',因此这种模板语言完全可以扩展。

* 可以自行设置模板定界符,所以你可以使用{}, {{}}, <!--{}-->, 等等。

* 诸如 if/elseif/else/endif 语句可以被传递到php语法解析器,所以 {if ...} 表达式是简单的或者是复合的,随你喜欢。

* 如果允许的话,section之间可以无限嵌套。

* 引擎是可以定制的.可以内嵌php代码到你的模板文件中,虽然这可能并不需要(不推荐)

* 内建缓存支持

* 独立模板文件

* 可自定义的缓存处理函数

* 插件体系结构

 

5.2 主题对模板

对系统使用主题文件和模板文件提交一个站点的方法,我们将试图提供一个概要。

为什么我们全部迷惑?

我的观点是,对人们来说混乱的主要原因源于下面两件事的差距:

  1. 人们认为它应该如何工作
  2. 它实际是如何工作的

2是给出的而且很可能不再改变(那些关于你继续下去的系统 2.x的发展知道模板和主题的方法已经更改数次,现在相当稳定)。

1仍然有很大的变化!主要的原因是实际上我们来自不同的后台;一些人来自phpNuke PostNuke以及类似的。另一些人,来自像Typo3和其它的'full suites'系统。然后,你们中的一些来自明码的php开发,那儿所有的一切都是徒手做的,来自scratch

第二个问题是系统 2.x模板中使用的术语应该被称为"Module/Block Templates",所以它们不会和主题模板混淆,主题模板是一件完全不同的事物(真正的在下面呈现)。

大图片

当你第一次使用模板和主题,你会注意到一件明显的事情:

·           每个模板设置由许多文件组成!(我上次检查,在没有安装模块的情况下,一个系统大概有36个模板)

·           一个主题有的文件数相对较少(默认的主题的文件数少于10个!)

在这个层次上的有些人可能会很惊讶!

对那些仍没感觉的人,我将举一个小例子。

显示最后注册的10位用户的名单的主题区块总是显示三样东西:区块头部的标题、用户注册的昵称和他们注册的时间。现在不要忘了我们想将设计与内容分离开来,好吗?

为此,我们会为这个单独的区块创建两个文件:

  1. 一个模板定义区块的结构,基本上是一个昵称+数据的表格,一行行,直到十行产生。
  2. 文件获得在上一步产生的信息,然后粘贴到一些'design'里面。这意味着将标题放在区块的顶端,在那之下使产生的列表。

在这个例子中,编号1是区块模板,而编号2是主题。区块模板被插入到主题区块的代码中。

这里,结论应该非常清楚了:

模板 (区块/模块的模板)控制数据显示的方法,而主题模板控制将显示多少数据(大多数通过分配变量元素一个类名称,这是在CSS中定义的)

 

更多详细资料
 

使用在系统 2.x中用到的术语:

"Template"是使用前集变量(由一个特殊的模块提供)的一段html代码使数据在站点显示。

"Theme"是一个特殊的模板(或模板设置),通过获取第一个模板(数据模板)的结果来控制一个系统站点的样式和图形,并将结果粘贴到应该粘贴的主题模板中。这意味着,再一次,我们有了两个模板:一个数据模板和一个主题模板。

 

从来不直接使用数据模板,而总是在主题模板的帮助下显示。

这意味着,除非你改变模块在区块中显示数据的方法,否则你就只会使用倒主题模板。我个人感觉系统 2.x 可以使用稍微友好的名字来消除潜在主题开发者的困惑。

 

附加的解释:

 

1.      模板控制模块内容的布局,而主题控制站点的整体外观。

 

2.      主题是在你的系统根目录下的主题文件夹中手动加载。要改变你整个网站的样式和外观,请下载标准主题,然后脱机编辑它使其符合你的喜好。然后在主题文件夹中加载主题文件(这样命名文件夹:themes/humbrietheme/theme.html等等。)。

 

你可以在系统管理菜单中的模板管理中编辑模板。复制默认的模板设置,然后根据你喜欢的外观和感觉来编辑复制后的设置。每个模块的模板都可以编辑。

 

若是你试图编辑模板文件夹中的theme.html而且看上去没有任何改变,务必确认你将常规设置中的"themes/your theme/templates目录更新.html模板文件?"选项设置为""

 

 

5.3. 创建一个主题

注意:在系统手册中这部分内容通常是由SkaagArgonius (aric@nsa.co.il)更新的。

5.3.1.1. CSS综述

做主题是相当简单的。打开你想要使用的主题的style.css页面,在页面中打乱CSS。开始之前,轻首先做好备份。

5.3.1.2. 公共的CSS

·                     表格类

·                     条目类

·                     注释类

·                     短消息类

表格类

下列类通常在系统磁心存储文件产生外观美观的HTML表格和表单。

下面这些就是替代系统1.x主题文件中的.bg1-5 .fg1-5类的:

.outer——定义一个表格外部的边或边框,通常归于<table>标签

Th——定义表格标题单元的外观

.head——定义表格下标题单元外观,归于<tr><td>标签

.even/.odd——用于提出正常单元之间的差异,归于<tr><td>标签

.foot——定义表格脚注单元外观,归于<tr><td>标签

 

例如:

下面是类是如何被定义和在系统磁心存储文件中用HTML使用的例子。

 

CSS

/* 定义一些默认的设置 */

table {width: 100%; margin: 0; padding: 0; font-size: small}

table td {padding: 0; border-width: 0; vertical-align: top; font-family: Verdana, Arial, Helvetica, sans-serif;}

 

th {background-color: #2F5376; color: #FFFFFF; padding : 2px; vertical-align : middle; font-family: Verdana, Arial, Helvetica, sans-serif;}

.outer {border: 1px solid silver;}

.head {background-color: #c2cdd6; padding: 5px; font-weight: bold;}

.even {background-color: #dee3e7; padding: 5px;}

.odd {background-color: #E9E9E9; padding: 5px;}

.foot {background-color: #c2cdd6; padding: 5px; font-weight: bold;}

 

/* 我们这么做是因为当上述类归于<tr>标签时,一些浏览器不支持*/

tr.head td {background-color: #c2cdd6; padding: 5px; font-weight: bold;}

tr.even td {background-color: #dee3e7; padding: 5px;}

tr.odd td {background-color: #E9E9E9; padding: 5px;}

tr.foot td {background-color: #c2cdd6; padding: 5px; font-weight: bold;}

 

HTML1

<table class="outer">

  <tr><th>th</th></tr>

  <tr><td class="head">.head</td></tr>

  <tr><td class="even">.even</td></tr>

  <tr><td class="odd">.odd</td></tr>

  <tr><td class="even">.even</td></tr>

  <tr><td class="odd">.odd</td></tr>

  <tr><td class="foot">.foot</td></tr>

</table>

将表现为:

HTML2

<table class="outer">

  <tr><th colspan="2">th</th></tr>

  <tr><td class="head">.head</td><td class="even">.even</td></tr>

  <tr><td class="head">.head</td><td class="odd">.odd</td></tr>

  <tr><td class="head">.head</td><td class="even">.even</td></tr>

  <tr><td class="head">.head</td><td class="odd">.odd</td></tr>

</table>

 

将表现为:

 

 

条目类

.item

.itemHead

.itemInfo

.itemTitle

.itemPoster

.itemPostDate

.itemStats

.itemBody

.itemText

.itemFoot

.itemAdminLink

.itemPermaLink

 

注释类

.comTitle

.comText

.comUserStat

.comUserStatCaption

.comUserStatus

.comUserRank

.comUserRankText

.comUserRankImg

.comUserName

.comUserImg

.comDate

.comDateCaption

 

短消息类

 

div.errorMsg

div.confirmMsg

div.resultMsg

 

5.3.1.3. 缺省的CSS及其注释

/* 这是控制一个页面的默认设置 */

body {color: black; background: white; margin: 0px; padding: 0px;}

 

/* 站点上的所有表格的默认设置,除非明确定义了一个特殊的表格 */

table {width: 100%; margin: 5px; padding: 5px; font-size: small}

table td {padding: 0px; border-width: 0px; vertical-align: top; font-family: Verdana, Arial, Helvetica, sans-serif;}

 

/* 这是控制默认的链接设置和鼠标移到上面的链接设置 */

a {color: #666666; text-decoration: none; font-weight: bold; background-color: transparent;}

a:hover {color: #ff6600;}

 

/* 控制从15的标题的HTML标签,无序列表和列表中的条目 */

h1 {4}

h2 {3}

h3 {9}

h4 {2}

h5 {1}

ul { margin: 2px; padding: 2px; list-style: decimal inside; text-align: left;}

li { margin-left: 2px; list-style: square inside; color: #2F5376}

 

/* 表单按钮的选择器 */

 

input.formButton {}

 

/* 下列出现的首要应用于NEWS故事 */

/* 虽然他们最好是可以在另一个区域被找到 */

/*

主要处理新闻的开始部分

*/

 

/* 新闻故事周围的边框 */

.item {border: 1px solid #cccccc;}

 

/* 新闻故事标题单元的背景色 */

.itemHead {padding: 3px; background-color: #2F5376; color: #FFFFFF;}

 

/*新闻标题右边区域的背景色(由某某发送) */

.itemInfo {text-align: right; padding: 3px; background-color: #efefef;}

 

/* 故事标题的正文,除了主题和标题间的冒号 */

.itemTitle a {font-size: 130%; font-weight: bold; font-variant: small-caps; color: #ffffff; background-color: transparent;}

 

/* 正文 "exta6sy" 前的粘贴者名称 */

.itemPoster {font-size: 90%; font-style:italic;}

 

/*紧跟在粘贴者名称后的正文的$date $time */

.itemPostDate {font-size: 90%; font-style:italic;}

 

/* 第几次阅读这个故事,但不是在括号中的总数 */

.itemStats {font-size: 90%; font-style:italic;}

 

/* 故事自己的正文 */

.itemBody {padding-left: 5px;}

 

/* 系统 开发者需要的帮助——这个看上去和上面的.itemBody一样。*/

/* 有什么不同呢??? */

.itemText {margin-top: 5px; margin-bottom: 5px; line-height: 1.5em;}

 

/* 在故事黑体中产生第一个字母 */

.itemText:first-letter {font-size: 133%; font-weight: bold;}

 

/* 一个新故事的脚注(阅读更多,等等) */

.itemFoot {text-align: right; padding: 3px; background-color: #efefef;}

 

/* 一个新闻脚注的[edit | delete]部分 */

.itemAdminLink {font-size: 90%;}

 

/* 新闻脚注的| xx# bytes more |部分 */

.itemPermaLink {font-size: 90%;}

 

/*

首先处理新闻的结束部分

*/

 

/* 控制一个表格头部的设置 */

 

th {background-color: #2F5376; color: #FFFFFF; padding : 2px; vertical-align : middle; font-family: Verdana, Arial, Helvetica, sans-serif;}

 

/* 页面顶端放置标志图和广告标识的区域 */

 

td#headerbanner {width: 100%; background-color: #2F5376; vertical-align: middle; text-align:center;}

 

/* 默认安装头部右下方的灰白条 */

 

td#headerbar {border-bottom: 1px solid #dddddd; background-image: url(hbar.gif);}

 

/*

处理三栏的开始部分

*/

 

/* 控制页面左边区块的设置 */

td#leftcolumn {width: 170px; border-right: 1px solid #cccccc; font-size:12px;}

 

/* 控制左边一栏表格头部的设置 */

td#leftcolumn th {background-color: #2F5376; color: #FFFFFF; vertical-align: middle;}

 

/* 控制左边一栏区块标题的设置 */

td#leftcolumn div.blockTitle {padding: 3px; background-color: #dddddd; color: #639ACE; font-weight: bold;}

 

/* 控制左边一栏区块内容的设置 */

td#leftcolumn div.blockContent {padding: 3px; line-height: 120%; line-height: 120%;}

 

/* 控制页面中间部分区块的设置 */

td#centercolumn {font-size: 12px;}

 

/* 控制中间栏表格头部的设置 */

td#centercolumn th {background-color: #2F5376; color: #FFFFFF; vertical-align: middle;}

 

/* 控制页面中间区块向正中对齐部分的设置 */

td#centerCcolumn {padding: 0px 3px 1px 3px;}

/* 中间区块的标题 */

td#centerCcolumn legend.blockTitle {padding: 3px; color: #639ACE; font-weight: bold; margin-top: 0px; margin-right: 0px; margin-left: 0px;}

/* 中间区块的内容 */

td#centerCcolumn div.blockContent {border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-bottom: 1px solid #dddddd; padding: 3px; margin-right: 0px; margin-left: 0px; margin-bottom: 2px; line-height: 120%;}

 

/*控制页面中间区块向左对齐部分的设置 */

td#centerLcolumn {width: 50%; padding: 0px 3px 0px 0px;}

 

/* 中间区块向左对齐部分的标题 */

td#centerLcolumn legend.blockTitle {padding: 3px; color: #639ACE; font-weight: bold; margin-top: 0px;}

 

/* 中间区块向左对齐部分的内容 */

td#centerLcolumn div.blockContent {border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-bottom: 1px solid #dddddd; padding: 3px; margin-left: 3px; margin-right: 2px; margin-bottom: 2px; line-height: 120%;}

 

/* 控制页面中间区块向右对齐部分的设置*/

td#centerRcolumn {width: 50%; padding: 0px 3px 0px 0px;}

 

/* 中间区块向右对齐部分的标题 */

td#centerRcolumn legend.blockTitle {padding: 3px; color: #639ACE; font-weight: bold; margin-top: 0px;}

 

/* 中间区块向右对齐部分的内容 */

td#centerRcolumn div.blockContent {border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-bottom: 1px solid #dddddd; padding: 3px; margin-left: 2px; margin-right: 3px; margin-bottom: 2px; line-height: 120%;}

 

/* 控制所有定义的事情,象是内容,例如在新闻模板中它控制的:*/

/* 文章正文、粘贴者、日期、时间和阅读数量,在括弧里 */

/* 用方括号[ | ]括起来的管理员编辑部分和在新闻注释页面底部同样否认: */

/*“评论属于粘贴者。我们不为其内容负责” */

/* 同样论坛页面上的大量的正文……可能到处是大量的素材……小心这点 */

 

div#content {text-align: left; padding: 8px;}

 

 

/* 页面右边一栏区块的设置 */

td#rightcolumn {width: 170px; border-left: 1px solid #cccccc; font-size:12px;}

 

/* 控制右边一栏表格的头部。*/

td#rightcolumn th {background-color: #2F5376; color: #FFFFFF; vertical-align: middle;}

 

/* 控制右边一栏区块的标题 */

td#rightcolumn div.blockTitle {padding: 3px; background-color: #dddddd; color: #639ACE; font-weight: bold;}

 

/* 控制右边一栏区块的内容区域 */

td#rightcolumn div.blockContent {padding: 3px; line-height: 120%;}

 

/* 处理三栏的结束部分 */

 

/* 系统 版权信息所在的底部条的设置 */

tr#footerbar {text-align:center; background-image: url(hbar.gif);}

 

/* 主菜单设置 */

td#mainmenu a {background-color: #e6e6e6; display: block; margin: 0px padding: 4px;}

 

/* 当鼠标移到主菜单上时发生的变化 */

td#mainmenu a:hover {background-color: #ffffff;}

 

/* 主菜单头部单元(代表性目录)。这种方式你可以给头部单元一个不一样*/

/*的边框或另一种外观。在整个菜单周围画一个方框来作为例子是有用的。*/

td#mainmenu a.menuTop {padding-left: 3px; border-top: 1px solid silver; border-right: 1px solid #666666; border-bottom: 1px solid #666666; border-left: 1px solid silver;}

 

/* 保持进入主菜单的入口除了上一行定义的头部 */

td#mainmenu a.menuMain {padding-left: 3px; border-right: 1px solid #666666; border-bottom: 1px solid #666666; border-left: 1px solid silver;}

 

/*当你在一个特殊模块打开的子菜单项的设置。例如: */

/* 当你在新闻模块时的"Submit news" "Archives" */

td#mainmenu a.menuSub {padding-left: 9px; border-right: 1px solid #666666; border-bottom: 1px solid #666666; border-left: 1px solid silver;}

 

/* 用户菜单设置 */

td#usermenu a {background-color: #e6e6e6; display: block; margin: 0px padding: 4px; border-right: 1px solid #666666; border-bottom: 1px solid #666666; border-left: 1px solid silver;}

 

/* 当鼠标移到用户菜单时发生的变化 */

td#usermenu a:hover {background-color: #ffffff;}

 

/* 在用户菜单上的大多数顶端插入 */

td#usermenu a.menuTop {border-top: 1px solid silver;}

 

/*当用户收到一个私人消息时的设置 */

td#usermenu a.highlight {background-color: #fcc;}

 

 

/* 绘制同类表格使用的样式 */

/* 系统.org wiki中一个单独页面的描述 */

.outer {border: 1px solid silver;}

.head {background-color: #c2cdd6; padding: 5px; font-weight: bold;}

.even {background-color: #dee3e7; padding: 5px;}

.odd {background-color: #E9E9E9; padding: 5px;}

.foot {background-color: #c2cdd6; padding: 5px; font-weight: bold;}

tr.even td {background-color: #dee3e7; padding: 5px;}

tr.odd td {background-color: #E9E9E9; padding: 5px;}

 

/* 不包括在默认设置里 */

/* 使给论坛标题添加特殊的颜色用户化。最好还是编辑newbb_index.html模板*/

.outerhead{}

.outerhead a{font-size: 12px; color : #FFFFFF;}

.outerhead a:hover{}

 

/* 可能不确定特殊系统信息 */

/* 我不要默认设置 */

div.errorMsg { background-color: #FFCCCC; text-align: center; border-top: 1px solid #DDDDFF; border-left: 1px solid #DDDDFF; border-right: 1px solid #AAAAAA; border-bottom: 1px solid #AAAAAA; font-weight: bold; padding: 10px;}

div.confirmMsg { background-color: #DDFFDF; color: #136C99; text-align: center; border-top: 1px solid #DDDDFF; border-left: 1px solid #DDDDFF; border-right: 1px solid #AAAAAA; border-bottom: 1px solid #AAAAAA; font-weight: bold; padding: 10px;}

div.resultMsg { background-color : #CCCCCC; color: #333333; text-align: center; border-top: 1px solid silver; border-left: 1px solid silver; font-weight: bold; border-right: 1px solid #666666; border-bottom: 1px solid #666666; padding: 10px;}

 

/* 当你往一个论坛发帖插入代码时的设置 */

div.系统Code { background: #FFFFFF; border: 1px inset #000080; font-family: "Courier New",Courier,monospace; padding: 0px 6px 6px 6px;}

/* 当你引用一个论坛发帖时的设置 */

div.系统Quote { background: #FFFFFF; border: 1px inset #000080; font-family: "Courier New",Courier,monospace; padding: 0px 6px 6px 6px;}

 

 

/* 注释系统的样式 */

.comTitle {font-weight: bold; margin-bottom: 2px;}

.comText {padding: 2px;}

.comUserStat {font-size: 10px; color: #2F5376; font-weight:bold; border: 1px solid silver; background-color: #ffffff; margin: 2px; padding: 2px;}

.comUserStatCaption {font-weight: normal;}

.comUserStatus {margin-left: 2px; margin-top: 10px; color: #2F5376; font-weight:bold; font-size: 10px;}

.comUserRank {margin: 2px;}

.comUserRankText {font-size: 10px;font-weight:bold;}

.comUserRankImg {border: 0px}

.comUserName {}

.comUserImg {margin: 2px;}

.comDate {font-weight: normal; font-style: italic; font-size: smaller}

.comDateCaption {font-weight: bold; font-style: normal;}

 

5.5. 制作一个好的主题

这里将提供一张详细说明的列表来帮助你创建主题和模板。

交叉浏览器的兼容性

·       交叉浏览器CSS技术

o                              特殊浏览器隐CSS

·       在多种浏览器测试你的主题

在多种版本的IE浏览器中测试

多种版本的IE浏览器——在相同的windows操作系统下

CD上的Linux测试 w/ Linux浏览器(在没有安装linux系统的情况下)

认证你的主题

使用认证来确认你的主题使用的是合适的代码

·           Web Design Group的在线HTML/XHTML认证

·           Web Design Group的在线CSS认证

 

支持从右到左的语言
 
参考

The NY Public Library Style Guide——现代设计如何使用XHTMLCSS的一本非常好的指南。

一个列出若干优秀的CSS参考的详述 (基础指南以及使用的考虑)

Holy CSS Zeldman (好的链接列表)

Web Design Group的在线HTMLCSS文档——指导包括英文版、西班牙语版、日文版、中文版 (只有CSS指导)

HTML Utopia:在没有表格的情况下用CSS设计

 

使用软件

Macromedia Dreamweaver

Macromedia Flash

 

 

5.6. Kickstart指南

这是介绍如何创建你自己的主题。

编辑默认的主题

步骤一

复制默认主题文件夹(主题/默认)并且重命名为"cool"或别的什么。现在你应该有一个叫"cool"的文件夹,它下面有和默认的主题文件夹下相同的文件。

打开"cool"文件夹下的theme.html文件,找到和下面列出的相同的字符串

<{include file="default/theme_blockleft.html"}>

看到了吗?将"default" 改成 "cool"以对应你的新文件夹。改过以后应该象下面这行一样:

<{include file="cool/theme_blockleft.html"}>

你还需要在这个文件中修改目录!

步骤二

现在你需要复制默认模板,因为默认模板是不能编辑的。到你的系统中的管理> 系统管理> 模板下复制默认模板。你应该把你的主题文件夹也设置成和上述同样的名字,在这里是"cool"

你在这里所做的要小心仔细。错误的编辑或修改这些模板会造成严重的后果。

步骤三

到管理>系统管理>参数选择>一般设置。选择"cool"做为默认主题和默认模板设置。设置"Update module template .html files from themes/your theme/templates directory?"为是。这个设置非常重要因为它是系统重新读取'new'csshtml代码的唯一方法,所以你不能随心所欲的测试你的改变。

你可能经常改变和重新测试主题的改变(再下面的步骤四)因为你发现它很有帮助。一旦你对你的结果满意了,你一定会将"Update module template .html files from themes/your theme/templates directory?"恢复为不。

现在你用你的"cool"主题完成系统的安装,不再是"default"主题。现在你可以编辑主题来符合你的需要。当发生任何错误,你可以转回到默认的主题。

步骤四

这是编辑阶段!对下面文件做个简短的描述

theme.html——控制你的网站主要的版面设置

theme_blockleft.html——控制左边区块的版面设置

theme_blockright.html——控制右边区块的版面设置

theme_blockcenter_c.html——控制中间区块中间部分的版面设置

theme_blockcenter_l.html——控制中间区块左边部分的版面设置

theme_blockcenter_r.html——控制中间区块右边部分的版面设置

style.css——你的主题的样式表

styleMAC.css——只对MAC的一些设置

styleNN.css——只对Netscape的一些设置

 

在这些文件中你可以定义你的网站的外观!模块的外观和每一个单独的区块都是可以通过模板控制的(如果它们使用了模板的话!)。

设计一个全新的主题
 

通常的,一个设计者在图形程序中设计他的网站外观。设计过程结束后他在此之外创建一个HTML站点!记住系统的三栏的外观是非常重要!

 

注意:如果你对视觉要求不高,我们之中有一些人是这样的,你可以使用像是FrontPage的工具,你可以用那个工具来设计外观。然而要当心的是,用FrontPage那样的工具生成的代码可能无法极佳的工作,而且很多时候在完全操作前肯定会要求清除一些。

 

Header=头部

lc = 左边栏

cc = 中间栏

rc = 右边栏

Footer= 底部

 

 

你有了你的三栏模式的HTML模板后,不得不复制你的模板中default/theme.html文件的重要部分。第一件事是头部的填充。

在这之后你将下面的代码复制到你的左边栏:

<!--开始左边区块循环-->

<{foreach item=block from=$系统_lblocks}>

  <{include file="default/theme_blockleft.html"}>

<{/foreach}>

<!--结束左边区块循环-->

 

<td></td>中间复制这些代码应该得到 id="leftcolumn",就像在默认主题中一样。这需要css定义。

 

这是要复制到中间栏的代码:

<!-- 开始显示中间区块 -->

     <{if $系统_showcblock == 1}>

 

        <table cellspacing="0">

          <tr>

            <td id="centerCcolumn" colspan="2">

 

            <!--开始中间区块中间部分循环-->

            <{foreach item=block from=$系统_ccblocks}>

              <{include file="default/theme_blockcenter_c.html"}>

            <{/foreach}>

            <!--结束中间区块中间部分循环-->

 

            </td>

          </tr>

          <tr>

            <td id="centerLcolumn">

 

            <!--开始中间区块左边部分循环-->

              <{foreach item=block from=$系统_clblocks}>

                <{include file="default/theme_blockcenter_l.html"}>

              <{/foreach}>

            <!--结束中间区块左边部分循环-->

 

            </td><td id="centerRcolumn">

 

            <!--开始中间区块右边部分循环-->

              <{foreach item=block from=$系统_crblocks}>

                <{include file="default/theme_blockcenter_r.html"}>

              <{/foreach}>

            <!--结束中间区块右边部分循环-->

 

            </td>

          </tr>

        </table>

 

        <{/if}>

        <!--结束中间区块循环-->

 

        <div id="content">

          <{$系统_contents}>

        </div>

 

<!--开始右边区块循环-->

        <{foreach item=block from=$系统_rblocks}>

          <{include file="default/theme_blockright.html"}>

        <{/foreach}>

        <!—结束右边区块循环-->

 

 

<td></td>中间复制这些代码应该得到 id=" rightcolumn "。在这之后你必须更改在theme.html文件中包含的图片的路径。如果每个图片都在你的主题文件夹中,<img>标签应该是这样:

<img src="<{$系统_imageurl}>logo.gif">

 

另外,当主题被系统完全分析时,图片无法正确的显示。

 

记住这是最基本的素材!你可以在你的主题中随你高兴的在栏目等地方浏览了。

 

 

5.7. 主题中的Javascript

默认的主题包括合理数量的Javascript代码来增强系统的用户接口。这个代码位于文件include/系统.js中,该文件被每个系统页面的接口装载。所有的自定义函数都可被默认主题和其它主题使用。另外,主题可能当然定义辅助的Javascript代码。

 

这个页面包含了所有默认Javascript函数的描述。正在工作上是一个进步。请添加函数的描述、自变量(和可能被忽略的自变量的默认值)。

- 系统GetElementById(id)

- justReturn()

- openWithSelfMail(url,name,width,height)

- setElementColor(id,color)

- setElementFont(id,font)

- setElementSize(id,size)

- changeDisplay(id)

- setVisible(id)

- setHidden(id)

- makeBold(id)

- makeItalic(id)

- makeUnderline(id)

- makeLineThrough(id)

- appendSelectOption(selectMenuId, optionName, optionValue)

- disableElement(target)

- 系统CheckAll(formname, switchid)

- 系统CheckGroup(formname, switchid, groupid)

- 系统SavePosition(id)

- 系统InsertText(domobj, text)

- 系统CodeSmilie(id, smilieCode)

- showImgSelect(imgId, selectId, imgDir, extra, 系统Url)

- 系统CodeUrl(id, enterUrlPhrase, enterWebsitePhrase)

- 系统CodeImg(id, enterImgUrlPhrase, enterImgPosPhrase, imgPosRorLPhrase, errorImgPosPhrase)

- 系统CodeEmail(id, enterEmailPhrase)

- 系统CodeQuote(id, enterQuotePhrase)

- 系统CodeCode(id, enterCodePhrase)

- 系统CodeText(id, hiddentext, enterTextboxPhrase)

- 系统Validate(subjectId, textareaId, submitId, plzCompletePhrase, msgTooLongPhrase, allowCharPhrase, currCharPhrase)

 

6. XOOPS模块开发指南

6.1. 综述

6.2. 编码标准

6.2.1. 增加的PHPDocumentor注释

6.3. 命名惯例

6.4. 模块开发

6.4.1. 文件结构

6.4.1.1. $modversion数组
6.4.1.2. 公共语言Strings (_MD_,_MB_,_AM_,_MI_)

6.4.2. Kickstart指南

6.4.3. 辅助特征

6.4.3.1. 使用内部注释系统
6.4.3.2. 使用内部通知系统
6.4.3.3. 使用内部组权限系统
6.4.3.4. 在模块中加入特征搜索
6.4.3.5. 安装后执行脚本

6.4.4. 自动定义的全局变量

6.4.5. 表格结构模块

6.4.5.1. 从数据库读取挑选的选项

6.5. 使用Xoops应用程序接口

6.6. 使用XoopsForm

6.7. XML远程过程调用

6.8. Xoops的进入端口模块

6.8.1. 源自Nuke的进入端口模块

6.8.1.1. Nuke-to-Xoops SQL
6.8.1.2. 用户自定义变量
6.8.1.3. 会话
6.8.1.4. NSN-Nuke 信息
6.8.1.5. PHP-Nuke 信息
6.8.1.6. PostNuke 信息

6.8.2. 源自Mambo的进入端口模块

 

6.1. XOOPS模块开发指南综述

学习如何开发模块最好的方法可能是学习核心模块的代码,象是“Contact”模块。但首先你至少应该已经通过工作熟悉了一些事。

Xoops系统一般是如何工作的。

Xoops模块安装。

PHP http://www.php.net

SQL, 尤其是 MySQL (如果你的模块访问了某个数据库)可以通过网站 http://www.mysql.com了解

Smarty模板引擎:http://smarty.php.net(有一个初学者课程)

Xoops编码标准,模块命名惯例,以及模块基本结构

 

还有一些基本的规则:

你一定有一个"xoops_version.php"文件,用来存储安装和初始化模块所必需的信息。

每个输出文件(例如,index.php)必需套用一个固定的格式:

1. require('../../mainfile.php'); 这个初始化Xoops/Smarty 引擎并且包括了若干个库。

2. require(XOOPS_ROOT_PATH.'/header.php'); 打开页面并初始化缓存。

3. $xoopsOption['template_main'] = "mytemplate_main.html"; 声明将要用的模板文件。

4.  将模块的逻辑放在这,通常被包含在逻辑模块中的有表单,数据库访问,等等,以及给Smarty 模板的输出赋值。

5.    include XOOPS_ROOT_PATH."/footer.php"; 文件结束。

模块的程序设计要求必须在header.php footer.php之间(或包含在内,如果你更喜欢的话)调整你的模块到页面中间适合的位置。如果页面将被提交,唯一的事情是在包含header.php之前决定程序逻辑,例如,检测登陆或用表单以POST方式提交数据。

6.2. 编码标准

XOOPS使用PEAR编码标准。详细资料请阅读PEAR Coding Standards.

 

6.2.1. 增加PHPDocumentor注释

XOOPS中类的联机文档编制应该沿用phpDocumentor的规定。

这只是编写有用的文档最简单的规范。一旦你变得更熟悉,你可能想阅读涵盖了整个包的作用域的phpDocumentor指南。

http://phpdoc.org/docs/HTMLframesConverter/DOM/phpdoc.de/

phpDoc写文档编制和直接在有争议的编码元素前写一个有特殊格式的块注释同样简单,它被称为DocBlock。最基本的DocBlock如下:

/**
   
   
 * Description of the element
   
   
 */
   
   

  
  
   
    
  
  

DocBlocks可以被用做很多不同的编码元素:define()声明,函数,类,类方法以及类属性,include()声明以及全局变量都可以被提取到文档中。

phpDocumentor从程序本身生成大量的文档,所以程序员不需要提供程序的结构,调用语法等等。只需要描述程序做了什么以及解释如何使用,对于其他的程序员可从制作的模块维护、扩展及调用程序。i.e.我们正在描述Xoops的应用程序接口。

DocBlocks

DocBlockPHP的一种块注释,以“/**”开始,“*/”结束。注释块内的每行以“*”开始。

DocBlock总是和程序中下一个符合条件的元素相关联,除非它在另一个DocBlock后。后面一种情况下,它是作为自身文件的文档。例如:

/**
   
   
 * Description of the File
   
   
 */
   
   
/**
   
   
 * Description of the Class
   
   
 */
   
   
class Something{
   
   

 

DocBlocks有三个不同的部分:

第一个是"Short Description",总是在系统中显示三行。

在一行空白行后跟着"Long Description"

DocTags

 

描述中可能包含一些HTML标签:

<b> <code> <br> <i> <ul> <ol> <li> <p> <pre>

加上一些特殊格式:

<kbd> -- 表示键盘键入/屏幕显示

<samp> -- 表示样本或例子 (php)

<var> -- 表示一个变量名

DocTags

描述之后你可以写许多行以某些被称为"DocTags"的关键字来表示特殊的元素特征的信息。所有的"DocTags"以字符“@”开始。下面举一个例子:

/**

 * Display some text

 * @author John Doe

 * @version 0.1

 * @param string Text to display

 * @return bool True if successful

 */

这里是对DocTags的一个总的概述,将经常被用到:

/**

 * @access   public, protected, or private

 * @author   author name

 * @copyright    (c) 2000-2003 The XOOPS Project (www.xoops.org)

 * @deprecated  reason and how to replace

 * @param    type        [$varname] description

 * @return    type   description

 * @package package name, usually the module name

 * @subpackage name of the subpackage

 * @see   name of another element that can be documented, produces a link to it in the documentation

 * @since a version or a date

 * @var   type   a data type for a class variable

 * @version  version

 */

(完整的DocTags列表及其描述可以在下面的网站上找到:

http://phpdoc.org/docs/HTMLframesConverter/DOM/phpdoc.de/phpDocumentor/tutorial_tags.pkg.html

 

自从PHP参数类型无须定义后,phpDocumentor无法从程序中提取信息,因此不得不在DocTags中给出一个参数的类型。参数类型应该是一个合法的PHP类型,像是string, int/integer, float, number, bool/boolean, array,

object, 或者 mixed。如果需要建立某一类的一个对象,该类的名称应该用作为参数类型(以正确的大写形式)。文档编制将会链接到那个类的定义。

6.3. 命名惯例

模块名

名字以xoops开始(任何大写字母或小写字母的组合)是保留字符

选择和模块目录名称相同或相近的名字

 

模块主目录名称

只用小写字母

名字以xoops开始(任何大写字母或小写字母的组合)是保留字符

模块数据库表名称

总是以模块目录名称为前缀(不用加XOOPS

只用小写字母

用下划线“_”分隔单词

例如:

模块名:MyModule

目录名:mymodule

表格名:mymodule_*

一般函数名称

总是以模块目录名称为前缀

只用小写字母

用下划线“_”分隔单词

例如:

模块名:MyModule

目录名:mymodule

函数名:mymodule_*

块函数名称

总是以b_yourmoduledirname_为前缀

只用小写字母

用下划线“_”分隔单词

例如:

模块名:MyModule

目录名:mymodule

块名:b_mymodule_*

变量名

名字以xoops开始(任何大写字母或小写字母的组合)是保留字符

只用小写字母

用下划线“_”分隔单词

 

类名称

名字以xoops开始(任何大写字母或小写字母的组合)是保留字符

总是以模块目录名称为前缀,并且第一个字母是大写

用大写字母分隔单词

例如:

模块名:MyModule

目录名:mymodule

类名称:MyModule

方法名称

名字以xoops开始(任何大写字母或小写字母的组合)是保留字符

用大写字母分隔单词

例如:

方法名:myMethod*

 

语言字符串

·                     以下划线开头,全部大写

·                     格式:_<PREFIX>_<MODULENAME>_<STRINGNAME>

·                     模块名不能与其它模块相冲突

·                     前缀用来突现需要字符串的地方(及存储在哪个文件中)

·                     前缀:

MD - language/english/main.php(字符串在主模块脚本中使用)

MB - language/english/blocks.php(字符串在模块区块中使用)

AM - language/english/admin.php(字符串在模块管理中使用)

MI - langauge/english/modinfo.php(字符串在模块安装和配置中使用)

·                     例如:

_MI_MYMODULE_TITLE

 

 

 

 

6.4.1. 文件结构

下面是XOOPS Version1 RC3中的模块的一个基本结构。要注意的是:不是每个模块都需要下面所有列出的目录或文件。

模块的主要内容从这里开始。

/admin目录
综述

检查,mainfile.php的包含以及语言文件在这里完成。

·       index.php

模块管理内容从这里开始。

·       menu.php

这个文件包括用来为模块生成弹出式管理菜单的变量。

/language目录
综述

这个目录至少应该包含依次包含定义语言常量的文件'english'目录。千万不要忘记,如果你没有这个文件夹,所有的东西都将表现为一串无用的数据。

目录下的文件

·           english/main.php

在模块主要内容中定义语言常量。

·           english/admin.php

在模块管理部分定义语言常量。如果管理页面中没有多个语言常量,这个文件将和english/main.php合并。

·           english/modinfo.php

xoops_version.php中定义语言常量。

·           english/blocks.php

blocks/blocks.php中定义语言常量。

/ blocks目录
综述

这个目录包括定义块显示或编辑函数的文件

目录下的文件

·           blocks.php

·           blocks.php

/ sql目录
综述

安装模块的SQL转储文件属于这个目录。

目录下的文件

·           mysql.sql

mysql 转储文件

·           postgresql.sql

postgreSQL转储文件

/ images目录
综述
目录下的文件

在模块中用到的任何图象文件。

/ cache目录
综述

动态创建或更新的文件属于这个目录。为了在这个目录中创建新的文件,目录的权限应该设置为可被服务器写入(UNIX/LINUX 服务器用命令:chmod 666 777)。

目录下的文件

该目录的权限应该设置为可被服务器写入(UNIX/LINUX 服务器用命令:chmod 666 777)。

 

/ templates目录
综述

Xoops 2 RC3及更高版本的模块HTML模板文件被xoops_version.phpmodversion数组调用。

目录下的文件

所有在模块中使用的所有模板。

/ templates/ blocks目录
综述

Xoops 2 RC3及更高版本的模块HTML模板文件为'blocks'项被xoops_version.phpmodversion数组调用。那些文件使用smarty变量显示模块信息。

目录下的文件

所有在模块区块中用到的模板。那些文件用smarty区块变量来显示模块区块信息。

6.4.1.1. xoops_version.php 文件

请记录所有你知道的关联数组的索引和解释(如果需要的话)。大多数是从不同的xoops_version.php文件剪切或粘贴得到的。

主要信息

·                     $modversion['name'] = _MI_NEWBB_NAME;

o                                            模块名称

·                     $modversion['version'] = 1.00;

o                                            模块版本

·                     $modversion['description'] = _MI_NEWBB_DESC;

o                                            模块的描述

·                     $modversion['credits'] = "Kazumi Ono<br />( http:/ /www.myweb.ne.jp/ )";

o                                            模块的提供者

·                     $modversion['author'] = "Original admin section (phpBB 1.4.4) by<br />The phpBB Group<br />( http:/ /www.phpbb.com/ )<br />";

o                                            模块的作者

·                     $modversion['help'] = "newbb.html";

o                                            模块的帮助模板

·                     $modversion['license'] = "GPL see LICENSE";

o                                            模块的许可证

·                     $modversion['official'] = 1;

o                                            是官方的Xoops模块(通常是0)

·                     $modversion['image'] = "images/xoopsbb_slogo.png";

o                                            模块面板中的图象和左边的导航菜单(如果有的话)

·                     $modversion['dirname'] = "newbb";

o                                            模块的目录

SQL

·       $modversion['sqlfile']['mysql'] = "sql/mysql.sql";

o                              SQL 声明建立模块需要的数据库表

·       $modversion['tables'][0] = "bb_categories";

o                              sql 转储创建的表的目录; 用于卸载

o                              0开始,下一个表的下标依次增加(例如: ['tables'][1],['tables'][2],等等)

Admin

·           $modversion['hasAdmin'] = 1;

o                显示管理导航条

·           $modversion['adminindex'] = "admin/index.php";

o                管理索引

·           $modversion['adminmenu'] = "admin/menu.php";

o                管理菜单图标的弹出菜单

菜单

·           $modversion['hasMain'] = 1;

o  插入主菜单 (没有设为0)

·           $modversion['sub'][1]['name'] = _MI_NEWS_SMNAME1;

o  主菜单中子菜单的名称 (单击模块时)

·           $modversion['sub'][1]['url'] = "submit.php";

o  插入模块目录的文件

模板

·           $modversion['templates'][1]['file'] = 'newbb_index.html';

o          所有模板文件 (子目录为'subdir/newbb_sub.html')

o          1开始,下一个文件的下标依次增加(例如: ['templates'][2],['templates'][3],等等)

o          将在数据库中被保存

o          注意: 这个数据项从1开始,而不是0

·           $modversion['templates'][1]['description'] = '';

o          模板文件的一个简短的描述

o          1开始,下一个描述的下标依次增加(例如: ['description'][2],['description'][3],等等)

o          将在数据库中被保存

o          注意: 这个数据项从1开始,而不是0

区块

 

·         一个'file'可以有许多names, descriptions, functions, options, edit_func, and templates --- (只要创建另一个组, 也就是说用数组来区别)
  • $modversion['blocks'][1]['file'] = "newbb_new.php";
  • $modversion['blocks'][1]['name'] = _MI_NEWBB_BNAME1;
  • $modversion['blocks'][1]['description'] = "Shows recent topics in the forums";
  • $modversion['blocks'][1]['show_func'] = "b_newbb_new_show";
  • $modversion['blocks'][1]['options'] = "10|1|time";
  • $modversion['blocks'][1]['edit_func'] = "b_newbb_new_edit";
  • $modversion['blocks'][1]['template'] = 'newbb_block_new.html';
  • $modversion['blocks'][1]['file'] = "newbb_new.php";
  • $modversion['blocks'][1]['name'] = _MI_NEWBB_BNAME1;
  • $modversion['blocks'][1]['description'] = "Shows recent topics in the forums";
  • $modversion['blocks'][1]['show_func'] = "b_newbb_new_show";
  • $modversion['blocks'][1]['options'] = "10|1|time";
  • $modversion['blocks'][1]['edit_func'] = "b_newbb_new_edit";
  • $modversion['blocks'][1]['template'] = 'newbb_block_new.html';
搜索
  • $modversion['hasSearch'] = 1;
  • $modversion['search']['file'] = "include/search.inc.php";
  • $modversion['search']['func'] = "newbb_search";
  • $modversion['hasSearch'] = 1;
  • $modversion['search']['file'] = "include/search.inc.php";
  • $modversion['search']['func'] = "newbb_search";

 

Smarty
  • $modversion['use_smarty'] = 1;
    • 是否使用 Smarty (默认是使用)

 

通知

  • $modversion['hasNotification'] = 1;
  • $modversion['notification']['lookup_file'] = 'include/notification.inc.php';
  • $modversion['notification']['lookup_func'] = 'newbb_notify_iteminfo';
  • $modversion['hasNotification'] = 1;
  • $modversion['notification']['lookup_file'] = 'include/notification.inc.php';
  • $modversion['notification']['lookup_func'] = 'newbb_notify_iteminfo';

 

  • $modversion['notification']['category'][1]['name'] = 'thread';
  • $modversion['notification']['category'][1]['title'] = _MI_NEWBB_THREAD_NOTIFY;
  • $modversion['notification']['category'][1]['description'] = _MI_NEWBB_THREAD_NOTIFYDSC;
  • $modversion['notification']['category'][1]['subscribe_from'] = 'viewtopic.php';
  • $modversion['notification']['category'][1]['item_name'] = 'topic_id';
  • $modversion['notification']['category'][1]['allow_bookmark'] = 1;
  • $modversion['notification']['category'][1]['name'] = 'thread';
  • $modversion['notification']['category'][1]['title'] = _MI_NEWBB_THREAD_NOTIFY;
  • $modversion['notification']['category'][1]['description'] = _MI_NEWBB_THREAD_NOTIFYDSC;
  • $modversion['notification']['category'][1]['subscribe_from'] = 'viewtopic.php';
  • $modversion['notification']['category'][1]['item_name'] = 'topic_id';
  • $modversion['notification']['category'][1]['allow_bookmark'] = 1;

 

  • $modversion['notification']['event'][1]['name'] = 'new_post';
  • $modversion['notification']['event'][1]['category'] = 'thread';
  • $modversion['notification']['event'][1]['title'] = _MI_NEWBB_THREAD_NEWPOST_NOTIFY;
  • $modversion['notification']['event'][1]['caption'] = _MI_NEWBB_THREAD_NEWPOST_NOTIFYCAP;
  • $modversion['notification']['event'][1]['description'] = _MI_NEWBB_THREAD_NEWPOST_NOTIFYDSC;
  • $modversion['notification']['event'][1]['mail_template'] = 'thread_newpost_notify';
  • $modversion['notification']['event'][1]['mail_subject'] = _MI_NEWBB_THREAD_NEWPOST_NOTIFYSBJ;
  • $modversion['notification']['event'][1]['name'] = 'new_post';
  • $modversion['notification']['event'][1]['category'] = 'thread';
  • $modversion['notification']['event'][1]['title'] = _MI_NEWBB_THREAD_NEWPOST_NOTIFY;
  • $modversion['notification']['event'][1]['caption'] = _MI_NEWBB_THREAD_NEWPOST_NOTIFYCAP;
  • $modversion['notification']['event'][1]['description'] = _MI_NEWBB_THREAD_NEWPOST_NOTIFYDSC;
  • $modversion['notification']['event'][1]['mail_template'] = 'thread_newpost_notify';
  • $modversion['notification']['event'][1]['mail_subject'] = _MI_NEWBB_THREAD_NEWPOST_NOTIFYSBJ;

 

6.4.1.2. 公共语言Strings (_MD_,_MB_,_AM_,_MI_)

任何以_MI_/_MB_/_AM_/_MI_ (模块命名约定)开头的是define()声明位于/language/english/*.php

什么是 _MD_?

_MD_是一个在主模块定义中使用的字符串。

模块的定义文件通常象是- language/english/main.php

什么是 _MB_?

_MB_是一个在模块区块中使用的字符串。

模块区块文件通常象是- language/english/ blocks.php

什么是 _AM_?

_AM_是一个在模块管理中使用的字符串。

模块管理文件通常象是- language/english/admin.php

什么是 _MI_?

_MI_是一个在模块安装和配置中使用的字符串。

模块安装和配置文件通常象是- language/english/modinfo.php

 

6.4.2 模块开发 Kickstart 指南

这是一个的Xoops 新手所创建的非官方指南,他只开发过两个模块,而且只有一个发表了。也就是一个不是很了解的新手写的他认为是这样的文档。 如果任何人想要对这份文档加入更多的助益,请尽情的做!

在你开始前

你应该:

规格表

我们学习制作的这个模块,目的是要向正在访问该模块的用户表示欢迎。 在未来我们将会扩充这个模块的功能,但是现在先让我们把基本架构弄出来。

  • 模块名: Greeter
  • 模块目录:greeter
这模块必须能够:
  • 它本身要能够在导航菜单中显示
  • 支持多语言(multiple languages)环境
  • 能够向用户说您好
目录结构

当您已经阅读过 ModuleBasicStructure,我假设你已经用骨架代码把目录结构都建好了。如果还没有,现在就请阅读一下 ModuleBasicStructure。我所创建好的结构看起来就像如下的样子:

  • XOOPS_ROOT/modules/greeter
    • language
      • english
    • templates

随着时间的推移,我们会在上述目录下面建新的目录和文件,但是现在,请先创建如同上述的结构就行了。

请注意:在以下的描述中,当我给出一个目录名或文件名时,除非有明确地表述,否则它们都对应于XOOPS_ROOT/modules/greeter

XOOPS 版本信息

创建一个文件 /xoops_version.php 其程序代码内容如下:

<?php

// 版权信息,说明,等等……放在这里

$modversion['name'] = _MI_GREETER_NAME;

$modversion['version'] = 1.00;

$modversion['description'] = _MI_GREETER_DESC;

$modversion['credits'] = '';

$modversion['author'] = '';

$modversion['help'] = 'help.html';

$modversion['license'] = 'GPL see LICENSE';

$modversion['official'] = 0;

$modversion['image'] = 'greeter_slogo.png';

$modversion['dirname'] = 'greeter';

 

// 管理

$modversion['hasAdmin'] = 0;

$modversion['adminmenu'] = '';

 

// 菜单

$modversion['hasMain'] = 1;

 

// 模板

$modversion['templates'][1]['file'] = 'greeter_greet.html';

$modversion['templates'][1]['description'] = '显示[欢迎您]表单';

?>

说明

上述的文件是相当容易了解的﹐但是我还是要说明一些项目。

_MI_ ... ? 那是什么?

任何以 _MI_ 为前缀的词,都是在 /language/schinese/modinfo.php语言文件里面定义的。 我们马上会创建这个文件,但是现在,我们只要知道,这是模块信息,它将被及时显示在用户眼前,因此需要在语言文件里事先定义。

模板

模板(Templates)会在模块安装时被编译,而且保存在数据库中。 因此,你必须让系统知道你将会使用到的每个模板。

模块信息语言文件

编辑 /language/schinese/modinfo.php 而且将下列内容放入其中。

<?php

define('_MI_GREETER_NAME', ' Greeter ');

define('_MI_GREETER_DESC', ' A simple module that greets the person logged in.');

?>

说明

看来挺容易的,对吧? 稍后我们将会把较多的信息加入这个文件里,但是它仍然是一样的语法;非常容易的。 现在如果我们想要增加一个法语的语言文件,我们要做的只是创建 /language/english/modinfo.php,然后放上相同的定义,不过这些定义要改为法语。 现在如果某人在法语的语系中使用此系统,Greeter会以他们的语言来显示它的名字和描述。 呵呵,很酷吧!

一个简单的小帮手

以如下的内容,创建 /header.php

<?php

require('../../mainfile.php');

?>

这就是一个简单的小帮手。

 

最主要的文件,index.php

这个其实也非常容易:

<?php

require('header.php');

 

$uname = !empty($xoopsUser) ? $xoopsUser->getVar('uname','E') : _MD_GREETER_ANONYMOUS;

 

//我们必须在引用header之前,设置好Template

$xoopsOption['template_main'] = 'greeter_greet.html';

 

//引用headers

require(XOOPS_ROOT_PATH.'/header.php');

 

$xoopsTpl->assign('greeting', _MD_GREETER_GREETING);

$xoopsTpl->assign('uname', $uname);

 

//引用footer

require(XOOPS_ROOT_PATH.'/footer.php');

?>

说明

哇!这里多了一点点的程序代码(但是还不算太多)。

$xoopsUser

/header.php 它的项目包含 ../../mainfile.php 时,很多变量和类就会自行产生。 $xoopsUser 就是其中的一个变量。 如果用户已经登录,用户名这个值赋给变量$xoopsUser,否则$xoopsUser仍是空的。因此,我们就可以得知用户的名字或者是游客(anonymous)。

_ MD_GREETER _ ... ? 还要再一次定义语言文件?

说对了!它们就是在语言文件里面用definde定义的,不过这次,它们没有在 /language/schinese/modinfo.php 里面定义,因为这些“_GR_ ...”并不包含模块信息,它们是在 /language/schinese/main.php 这个文件里定义的,稍候我们会创建这个文件。

然后他们要处理什么?

$xoopsTpl

这是另一个变量,当程序引用了 /header.php 时就自动产生了。它也是Smarty类。 Smarty的速成课程中(http://smarty.php.net/crashcourse.php),他们定义 $xoopsTpl 变量为 $smarty 它只是你在 $xoopsOption['template_main'] = 'greeter_greet.html'模板中所创建的 Smarty类。

为了完整的利用这些功能,你可能需要学习Smarty 而我现在并不会在这里使用它的完整功能。

XOOPS_PATH.'/header.php' XOOPS_PATH.'/footer.php'

这只是 header footer。在这里你要知道的重要一点是:

1. 你必须将它们包含(include)进来

2. 在还没把XOOPS_PATH.'/header.php'包含之前,你不能使用$xoopsTpl

3. 所有$xoopsTpl操作必须在两个require语句之间完成

 

/language/schinese/main.php

这个文件也很简单,和 /language/schinese/modinfo.php 差不多。 以下就是内容:

<?php
define('_GR_GREETING', '
你好,');
define('_GR_ANONYMOUS','
游客');
?>

说明

嗯,没什么需要解释的了!

 

/templates/greeter_greet.html

这个文件是个真实的Smarty 模板文件。 它也很简单。

<p>

<{$greeting}> <{$uname}>

</p>

说明

重要说明 Xoops 世界中,所有的Smart 程序代码的Smarty标签都是 <{...}> 而不是像Smartys速成课程中所说的 {...} 标签。 {...} 是无法在XOOPS里工作的。请牢记!

现在,<{$greeting}> 就从 /index.php里面的 $xoopsTpl->assign('greeting', ...); 获取已经定义好的值;<{$uname}> 也是一样的作用。

准备好了吗?

好了。 我认为我们已经完成使这个模块运行的所有必要工作。我们来个测试吧! 我不打算在这里讲述如何安装这个模块。 你应该已经知道该怎么做了。 但是我要说,如果每个步骤都准确无误地完成,那么你应该可以在 Admin/Modules 的页面上看到 欢迎您 这个模块。 安装它,然后回到你的首页。你应该看见 欢迎您 出现在你的导航菜单上。 点击它,看看它工作得如何!

你应该看到和下面类似的画面:

你好,杰里米

呵呵!至少那是它对我说的。 如果是你自己登录的话,当然就是“你好,你的名字”。或者,如果没有登录,就显示“你好,游客”。

注意:如果你只看见一个空白页,你应该试着更新模块。进入System Admin——> Modules,然后点击greeter module 旁边的'update module'按钮。这是我的问题。如果还是显示空白页,建议返回检查,这是一项艰苦的工作,但是欢迎来到开发者的世界。我保证我们都曾经历过。

总结

本文就说这些。但是我将会添加更多的信息到 XoopsModuleDoc 里,以便处理更多像数据库连结、管理页面接口等话题。如果你有任何的意见或问题,请发电子邮件给我: jc@cowgar.com。你也可以访问我的 Xoops 站点: http://cowgar.com/ 。在那里你可以下载完整的 欢迎您(Greeter)源代码。它被包装的很好,也很容易安装。 直接访问下载区就可以了。

模块的辅助特性

在模块中添加评论特性

在模块中添加通告特性

在模块中添加组权限特性

集成模块满足Xoops检索特性

安装后执行脚本

 

6.4.3.1. 在模块中添加XOOPS全局评论特性(Smarty版本)
步骤1

在进行后面的步骤前,有两个变量你必须要准备好。它们是:

A每个条目的ID对应的键名(URL键值对方式,如:name=idname就是键名),确定哪个评论将被添加。例如:在News模块中的'storyid',在XoopsPoll模块中的'poll_id'

B当上述唯一的键值(id)通过HTTP GET方式请求传递时,对应文件显示该键值的条目。例如:News模块的文件'article.php',访问每一个article会显示article.php?storyid=(这里填唯一的ID)。同样的,XoopsPoll模块的文件'pollresults.php' 也是如此。

现在打开xoops_version.php加入下面列出的内容:

 

$modversion['hasComments'] = 1;

$modversion['comments']['itemName'] = 'value obtained in A';

$modversion['comments']['pageName'] = 'value obtained in B';

 

例如,在News模块中:

 

$modversion['hasComments'] = 1;

$modversion['comments']['itemName'] = 'storyid';

$modversion['comments']['pageName'] = 'article.php';

步骤2

将下面的文件从web links模块中复制到你的模块目录

  • comment_new.php
  • comment_edit.php
  • comment_delete.php
  • comment_post.php
  • comment_reply.php
步骤3

打开在步骤1 B中规定的文件(例如:News中的article.php),在包含footer.php前加入下面给出的语句

include XOOPS_ROOT_PATH.'/include/comment_view.php';

步骤4

为模块打开适当的模板文件(News模块打开news_article.html文件),将下面列出的复制到显示评论的地方。当然你可以自定义HTML标签。

<div style="text-align: center; padding: 3px; margin: 3px;">

  <{$commentsnav}>

  <{$lang_notice}>

</div>

 

<div style="margin: 3px; padding: 3px;">

<!-- start comments loop -->

<{if $comment_mode == "flat"}>

  <{include file="db:system_comments_flat.html"}>

<{elseif $comment_mode == "thread"}>

  <{include file="db:system_comments_thread.html"}>

<{elseif $comment_mode == "nest"}>

  <{include file="db:system_comments_nest.html"}>

<{/if}>

<!-- end comments loop -->

</div>

从用户的角度看,那就是所有需要添加的内容。

 

从管理的角度,只要删除一个条目将导致依赖该条目的评论也被删除,同时用户发表的数量也因此更新,总是访问下面的函数。

function xoops_comment_delete(integer module_id , integer item_id)

例如在News模块中,只要删除一个news article,这个函数被如下方式访问:

xoops_comment_delete($xoopsModule->getVar('mid'), $storyid);

另一个有用的函数是xoops_comment_count(),它把模块的ID和条目的ID作为自己的参数并且返回规定的条目的评论总数。

function xoops_comment_count(integer module_id [, integer item_id])

 

如果item_id未被指定,则返回根据module_id规定的模块的评论的总数。

步骤5(可根据需要选择)
建立回调函数

你可以通过在xoops_version.php中加入下面一行命令来指定回调函数:

 

$modversion['comments']['callback']['update'] = 'function';

一个被核准的评论发送成功的话,函数将被执行。这包括评论被管理员发送,状态由'pending'改为'active'。一个以被核准的XoopsComment对象将被当作第一个而且也是唯一的参数。举例注意对象提交的评论应该会有用。

$modversion['comments']['callback']['update'] = 'function';

 

只要一个条目的状态为'active'的评论的总数发生变化,函数将被执行。两个参数将被当作键变量参数,条目唯一的ID作为第一个参数,而处于active状态的评论总数则作为第二个参数。

 

回调函数所在的文件名被定义。

 

例如

 

modules/mylinks/xoops_version.php

 

...

$modversion['comments']['callbackFile'] = 'include/comment_functions.php';

$modversion['comments']['callback']['approve'] = 'mylinks_com_approve';

$modversion['comments']['callback']['update'] = 'mylinks_com_update';

...

 

 

modules/mylinks/include/comment_functions.php

 

function mylinks_com_update($link_id, $total_num){

$db =& Database::getInstance();

$sql = 'UPDATE '.$db->prefix('mylinks_links').' SET comments = '.$total_num.' WHERE lid = '.$link_id;

$db->query($sql);

}

 

function mylinks_com_approve(&$comment){

/ / 发送通知邮件

}

 

6.4.3.2. XOOPS 2全局通知系统

 

引言

通知特性为用户提供了一种集中的订阅特殊事件的方法,当事件发生时通过邮件或私人消息来接收。

 

用户观点-如何订阅事件

在允许通知模块的每张页面上,你将看到可以订阅的事件的列表。这个列表可能内嵌在模块中,也可能在一个'block'里,或两者都有,这取决于管理员对这个特性的配置。

事件的例子包含:“通知我最新的线索中的新邮件” ,“通知我当一个新的论坛被创建时” ,“通知我当评论被发表到当前的链接时” ,以及“将此线索加入书签。书签事件是特殊的,因为它不产生任何的通知消息……仅仅让你跟踪不同的模块中的不同条目。(你可以在用户菜单的通知页面看到你的标签。)

要订阅一个事件,选择复选框,然后点击"立即更新"按钮。不订阅就不要选复选框,然后点击"立即更新"按钮。你可以在同一时间做多种改变。

你同样可以在用户菜单中找到一个叫做通知的页面。它会给出你当前订阅的所有事件的列表。你可以在这个页面做成批的删除,来删除任何你不想再接收的通知。

注意,你的用户个人信息同样包括了两个你可以控制的相关选项。

第一个选项是通知方法,决定你将如何接收通知信息……是通过电子邮件(使用你个人信息中设定的地址),或者是通过短消息(使用网站内部的私人消息系统)。你可以选择暂时拒收所有通知。要暂时拒收请只使用这种方式;要永久拒收则不要订阅事件。举个例子说明:当你在度假的时候,离开时你可以设置成禁止接受,将消息悬挂起来;当你回来了就可以激活而不需要重新订阅所有的事件。

第二个界面选项时默认的通知模式。可用选项为总是发送(默认),就是发送消息来订阅所有的时间。另一种模式是只发送一次后禁用直到下一次登陆,对大业务量的线程来说是非常有用的。你会收到线程中一条新的邮件的通告消息,然后通告将被悬挂起来。所以你会知道至少有一个新邮件,但不知道有多少个。当你再次登陆时通告会自动被激活。理论上,当你离开时,你被告知至少有一个邮件,你登陆以得到线程的消息并希望被通告那个线程的更多的邮件。最后一种模式是只发送一次后禁用,你只会收到一个消息然后不再订阅。

要改变你当前一个事件的订阅模式,你就不得不改变你个人信息的模式,然后再停止订阅或重新订阅那个事件。

管理员观点——配置通知

当模块支持通知时,两个选项会被自动加到模块的设置菜单中。

启用通知:这个选项允许你控制用户可以怎样订阅通知(例如:通过通知选项区块,或是通过一个表格嵌入模块页面自身(联机的))。它同样允许你完全的禁止通知(例如:不发送消息)。

通知事件:这个选项允许你选择你的用户可以订阅哪些事件(来自模块可用的全部合理的事件)。某些事件可以自动添加,除了模块编写者提供的以外。如果模块支持评论功能,评论添加完毕、评论提交完毕的选项会自动出现。书签的选项在某些范围内同样是可用的。用户完全看不到停用的事件。

 

模块编写者的观点 —— 在你的模块中添加通告
修改xoops_version.php
前言

模块的配置文件xoops_version.php中,指定模块通知选项是可用的。每个分类从本质上代表了模块处理的一种类型的对象。例如:在newbb模块里,我们有分类:'thread'代表发生在thread上的事件,'forum'代表发生在forum上的事件,以及'global'代表发生在任何非特定事情上的事件。每个分类(除了'global')必须关联一个唯一的ID,这个ID可以用来从对应的分类中搜索一个特定的元素(例如;从所有的论坛分类中指定的部分)。

下一步,你指定单独的通知事件。每个事件属于一个特定的分类。例如:在newbb模块中,'new_post'是属于分类'thread'的一个事件。那么用户可能会订阅属于一个特殊的线索的'new_post'通知,只要一个新邮件被加到那个线索他就会收到一个通知信息。另一个事件是‘通知我这个论坛中的新线索’,它属于分类'forum'。最后还有一个事件‘通知我新的论坛’,它属于分类'global'

少数事件是自动维护的……发送的评论(以及提交的评论(只有管理员的是))的通知,及书签(不通知用户,但让用户跟踪固定的对象)。因为有了这些自动的事件,你无须指定xoops_version.php中的什么,除非你希望忽略显示的文本字符串或是邮件模块(一般不推荐)。

首行添加:

$modversion['hasNotification'] = 1;

 

指定你的分类:

$modversion['notification']['category'][1]['name'] = 'thread';

$modversion['notification']['category'][1]['title']= _MI_NEWBB_THREAD_NOTIFY;

$modversion['notification']['category'][1]['description']= _MI_NEWBB_THREAD_NOTIFYDSC;

$modversion['notification']['category'][1]['subscribe_from']= 'viewtopic.php';

$modversion['notification']['category'][1]['item_name'] = 'topic_id';

$modversion['notification']['category'][1]['allow_bookmark'] = 1;

 

  • name:分类的名称
  • title:分类的标题(用语言字符串)
  • description:分类的描述(用语言字符串)
  • subscribe_from:用户允许订阅的所有脚本的一个数组(所有的脚本用'*'。无脚本就省略这行。注意:只有你的模块为用户订阅提供另外的方法时,你可以不订阅脚本。例如:表单中的自定义复选框)
  • item_nameHTTPget方式监视参数,通过指定分类中特定的条目(例如:论坛ID或线索ID
  • allow_bookmark:如果你希望系统允许该条目可被用户加入书签就设为1

 

指定你的事件:

$modversion['notification']['event'][1]['name'] = 'new_post';

 $modversion['notification']['event'][1]['category'] = 'thread';

$modversion['notification']['event'][1]['title'] = _MI_NEWBB_THREAD_NEWPOST_NOTIFY;
$modversion['notification']['event'][1]['caption']= _MI_NEWBB_THREAD_NEWPOST_NOTIFYCAP;

$modversion['notification']['event'][1]['description']= _MI_NEWBB_THREAD_NEWPOST_NOTIFYDSC;

$modversion['notification']['event'][1]['mail_template'] = 'thread_newpost_notify';

$modversion['notification']['event'][1]['mail_subject']= _MI_NEWBB_THREAD_NEWPOST_NOTIFYSBJ;

 

  • name:事件的名称
  • category:事件的分类
  • title:分类的标题(用语言字符串)
  • caption:表单“通知我当……”中的描述(使用语言字符串)
  • description:事件的描述(用语言字符串)
  • mail_template:模块目录language/<language>/mail_template中的邮件模板(省略后缀'.tpl'
  • mail_subject:电子邮件的主题(使用语言字符串)

可用的附加选项:

  • admin_only:如果你希望事件只有模块管理员可以看见就设为1
  • Invisible:如果你希望事件是不可见的就设为1……例如:不要在模块的首选项或通知区块中显示。被用作'custom'通知:例如,在'mylinks'中,当你链接提交被批准时,你可以(在提交表单上)签定一个以前的通知。'approve'事件就会不可见了。

对自动事件(评论,评论提交和书签),如果你希望忽略文本字符串或邮件模板就可以在这指定信息(还没测试,不推荐这样做)。只指定你要的别的事件。

指定帮助函数

查找:

如果你的模块支持评论或书签功能,你将需要编写一个帮助函数。

$modversion['notification']['lookup_file'] = 'include/notification.inc.php';

$modversion['notification']['lookup_func'] = 'forum_item_info';

 

指定文件和这个文件中的帮助函数。作为forum_item_info($category,$itemid)被核心程序访问。你的函数将返回一个相关数组,其名称与你的条目相同,路径与访问该条目的路径相同。以/modules/newbb/include/notification.inc.php做一个例子。

标签:

另一个帮助函数用来在邮件模板标签(看下面的标签信息)中产生置换。标准的标签是自动定义的。标签可以在触发一个事件的期间传递(通常更便利),或在通知期间,标签函数被自动访问。

$modversion['notification']['tags_file']='include/notification.inc.php';

$modversion['notification']['tags_func'] = 'forum_tags';

 

如果你使用评论通知的用户化电子邮件并且你希望使用这张页面上的非标准化的标签,你才真正需要。而正常情况下是不需要的。

将这个文件复制到你的模块目录中

从模块目录newbb复制到你的模块根目录下:

notification_update.php

 

电子邮件标签

当发送一条消息时,你可以把标签放进你的电子邮件中来扩展。像这样用花括号括起来就可以了:{TAG}

几个内部标签:

普通标签:
  • X_SITEURL——站点的URL路径
  • X_SITENAME——站点的名称
  • X_ADMINMAIL——管理员的电子邮件地址
用户相关标签:
  • X_UNAME——用户名
  • X_UID——用户ID
  • X_UACTLINK——用户帐号激活链接(自从它成为用户注册过程后,你也许永远也不用这个)

 

通知相关标签:
  • X_MODULE——模块名
  • X_MODULE_URL——到模块的主页的链接
  • X_NOTIFY_EVENT——被触发的事件
  • X_NOTIFY_CATEGORY——事件的分类
  • X_UNSUBSCRIBE_URL——到用户通知页面的链接

 

特殊标签:

这些是由内核产生的通知事件使用的,像是评论。你在自己的邮件模块中可能不会用到它们,使用更多易读的标签名来代替。

  • X_ITEM_TYPE——条目的类型(分类'title'
  • X_ITEM_NAME——例如:论坛的名称,线索的标题,等等……
  • X_ITEM_URL——条目的URL地址

顺便提一下,系统从你的查找功能函数中产生X_ITEM_NAME and X_ITEM_URL,所以只有当查找功能函数被定义了它们才是可用的。

触发事件

当发送评论时将自动触发评论事件。依据评论规则,管理员可以订阅提交到一个特定条目的评论的通知。所有的用户可以订阅提交到一个特定条目的评论(已审核的)的通知。

其他的事件必须通过访问被明确的触发:

$notification_handler =& xoops_gethandler('notification');

$notification_handler->triggerEvent ($category, $item_id, $event, $extra_tags=array(), $user_list=array(), $module_id=null, $omit_user_id=null);

 

在你的程序中的适当位置。

  • $category——分类的名字(字符串型)
  • $item_id——分类的ID/如果你想通知一个全局事件,类型设为'0'(整型)
  • $event——事件的名称(字符串型)
  • $extra_tags——你希望在你的邮件模板中扩展的标签的相关数组。

 

标签是键,扩展是值。例如:$extra_tags['MY_TAG'] = "My text"。核心还是访问你的'tags'函数,如果该函数被定义了的话(看上面的描述)所以你可以把模块范围的标签放在那,而不是在模块中的触发器单独生成。

  • $user_list——如果空白,任何订阅事件的用户将收到通知。如果你指定一个用户数组(用户ID的数组),只有那些用户将被通知(只有当他们订阅时)。
  • $module_id——模块ID(默认当前模块)
  • $omit_user_id——通知中忽略用户ID(默认当前用户),但你可以设定'0'如果你希望当前包括用户。

总之,只有前四个参数是必需的。

允许用户订阅通知

一个区块中提供的订阅选项依照xoops_version.php中的规定信息完全自动的实现。

在主模块页面中提供订阅选项,你需要在相关模板中添加下面这行:

<{include file='db:system_notification_select.html'}>

 

另外,你可以选择往表单中增加客户订阅选择(例如:使用复选框)。举个例子:若用户在论坛发送消息时选择了复选框,你可以直接访问:

$notification_handler =& xoops_gethandler('notification');

$notification_handler->subscribe ($category, $item_id, $events, $mode=null, $module_id=null, $user_id=null).

  • $mode——你可以强制设置特殊通知模式(看上面的讨论)。如果为空,则使用默认的用户模式(他们的个人设置)。

总之,只有前三个参数是必需的。

设置复选框的初始状态,你可能希望看见用户是否订阅当前事件。你可以对下述的函数做这样的处理(返回真/假):

$notification_handler =& xoops_gethandler('notification');

$notification_handler->isSubscribed ($category, $item_id, $event, $mode=null, $module_id=null, $user_id=null)

总之,只有前三个参数是必需的。

删除被删除条目的通知

最后一件要做的事:只要你从模块中删除一个条目(例如:删除一个线索或一个邮件),你必须删除这个条目的所有通知。

你可以这样处理这个函数:

xoops_notification_deletebyitem ($module_id, $category, $item_id);

 

6.4.3.3 在你的模块中添加组权限特性
要求

=

XOOPS 2.0.4

XOOPS 2.0.x加上下述文件:

/class/xoopsform/grouppermform.php

/modules/system/admin/groupperm.php

/include/functions.php included in 2.0.4

/kernel/groupperm.php in 2.0.4

 

管理方面
添加权限

一些初始设置(/modules/mymodule/admin/index.php

include '../../../include/cp_header.php';

include_once XOOPS_ROOT_PATH.'/class/xoopsform/grouppermform.php';

$module_id = $xoopsModule->getVar('mid');

 

我们将要设置权限的条目的列表。

大多数情况下,这个将从数据库中检索得到。在这里我们使用静态数组做例子。

$item_list = array('1' => 'Category 1', '2' => 'Category 2', '3' => 'Category 3');

 

 

组权限表单的标题

$title_of_form = 'Permission form for my module';

权限名称在模块中应该是唯一的

$perm_name = 'Category Permission';

 

权限的一个简短描述

$perm_desc = 'Select categories that each group is allowed to view';

 

创建及显示表单

$form = new XoopsGroupPermForm($title_of_form, $module_id, $perm_name, $perm_desc);

foreach ($item_list as $item_id => $item_name) {

$form->addItem($item_id, $item_name);

}

xoops_cp_header();

echo $form->render();

xoops_cp_footer();

然后会显示如下图的表单,周围是xoops管理面板:

权限设置通过表单提交,该表单会被/modules/system/admin/groupperm.php自动存储在数据库中。

删除权限

最后要做的是:只要你从模块中删除了一个条目(例如:删除了一个分类,一个主题),你必须删除该条目的所有组权限。

你可以这样处理这个函数:

xoops_groupperm_deletebymoditem ($module_id, $perm_name, $item_id);

$module_id – 模块ID (必需的)

$perm_name – 权限名称(可选的)

$item_id – 删除条目的ID (可选的)

 

用户方面

假如一个用户通过HTTP GET方式请求一个分类的内容。变量$_GET['category_id']将被用来识别请求的分类。

指定我们将要校验的权限。这很可能是管理员创建的权限名称之一。

$perm_name = 'Category Permission';

条目唯一的ID校验权限

$perm_itemid = intval($_GET['category_id']);

得到当前用户属于的组ID

if ($xoopsUser) {

$groups = $xoopsUser->getGroups();

} else {

$groups = XOOPS_GROUP_ANONYMOUS;

}

 

得到当前的模块ID

$module_id = $xoopsModule->getVar('mid');

 

得到组权限的句柄。

$gperm_handler =& xoops_gethandler('groupperm');

 

 

现在检查当前用户是否可以通过访问句柄类的checkRight()方式来使用分类。

if ($gperm_handler->checkRight($perm_name, $perm_itemid, $groups, $module_id)) {

allowed, so display contents within the category

} else {

not allowed, display an error message or redirect to another page

}

 

高级话题

如果条目需要校验有父子树结构的权限,条目的双亲节点的ID作为XoopsGroupForm?::addItem()方式的第三个参数提供。

 

XoopsGroupForm?类会生成一个以树型结构显示每个条目的表单。一个条目的权限只有在给了其双亲条目同样的权限时才可能被添加。

 

假设我们的分类有如下的树型结构:

Category 1 (ID: 1)

+++ Category 2 (ID: 2)

++++++ Category 3 (ID: 3)

++++++ Category 4 (ID: 4)

+++++++++ Category 6 (ID: 6)

+++ Category 5 (ID: 5)

++++++ Category 8 (ID: 8)

Category 7 (ID: 7)

+++ Category 9 (ID: 9)

++++++ Category 14 (ID: 14)

Category 10 (ID: 10)

+++ Category 11 (ID: 11)

+++ Category 13 (ID: 13)

Category 12 (ID: 12)

 

上述的分类结构可以用如下的一个数组表现:

$categories[1] = array('name' => 'Category 1', 'parent' => 0);

$categories[2] = array('name' => 'Category 2', 'parent' => 1);

$categories[3] = array('name' => 'Category 3', 'parent' => 2);

$categories[4] = array('name' => 'Category 4', 'parent' => 2);

$categories[5] = array('name' => 'Category 5', 'parent' => 1);

$categories[6] = array('name' => 'Category 6', 'parent' => 4);

$categories[7] = array('name' => 'Category 7', 'parent' => 0);

$categories[8] = array('name' => 'Category 8', 'parent' => 5);

$categories[9] = array('name' => 'Category 9', 'parent' => 7);

$categories[10] = array('name' => 'Category 10', 'parent' => 0);

$categories[11] = array('name' => 'Category 11', 'parent' => 10);

$categories[12] = array('name' => 'Category 12', 'parent' => 0);

$categories[13] = array('name' => 'Category 13', 'parent' => 10);

$categories[14] = array('name' => 'Category 14', 'parent' => 9);

 

当我们添加一个条目入口到组权限表单,我们必须提供它的双亲的ID作为第三个参数

foreach ($categories as $cat_id => $cat_data)

{

$form->addItem($cat_id, $cat_data['name'], $cat_data['parent']);

}

 

(如果$cat_id$cat_data['parent']MySQL补零,请不要忘记在$form->addItem()前要对其进行intval()操作)

 

这将生成如下的一个表单:

 

当该表单被提交,提交的数据将会被验证,所以条目的权限在没有给其双亲条目相同的权限的情况下是不会被授权的。既要通过客户端(javascript)的验证,又要通过服务器端(php)的验证。因此,在模块的用户方面,没有必要检查请求的条目的所有双亲条目的权限,只要检查被请求的条目即可。

 

6.4.3.4.加入特征搜索

1. 第一个要加入到文件xoops_version.php代码中的东西在所述的模块的主目录中。

例如在文件夹‘…./modules/myguestbook’中有一个xoops_version.php文件。打开它加入下面的几行命令或你的版本:

// Search
   
   
$modversion['hasSearch'] = 1;
   
   
$modversion['search']['file'] = "include/search.inc.php";
   
   
$modversion['search']['func'] = "guestbook_search";
   
   

 

2. 第二步,在包含的(所述模块的)文件夹中加入你的php文件。

prefix("myguestbook")."";
   
   
// 因为count()返回1即使是一个提供的变量
    
    

 

6.4.3.5. 安装后执行脚本
背景

有时安装了一个模块后,你可能喜欢按固定的步骤来初始化。如果所有你要做的只是添加记录到xoops数据库中,你可以将它们放置在你的数据库脚本的结尾处。但你需要更多的时候要做什么呢?若你需要加一个用户到Xoops时要做什么呢?加一个组时呢?或在主机服务器上创建文件时呢?当你需要从Xoops系统获取适当的函数信息信息时要做什么?Xoops让你创建一个函数,在初始化后执行xoops_version.php命令onInstal

安装

首先你需要在xoops_version.php中加入下面这行命令

$modversion['onInstall'] = 'installscript.php';
   
   

 

它会告诉模块的安装程序运行和xoops_version.php在同一目录下的脚本installscript.php。现在我们需要使用实际安装后的脚本。我们想为新的模块myMoudle创建一个高速缓存目录。创建一个和xoops-version.php在同一目录下的叫installscript.php的文件,然后加入下面的语句:

getVar('dirname');

     //Always check if a directory exists prior to creation

     if (! is_dir($cacheDir)) {

         return mkdir($cacheDir, 0777);

     } else {

         return true;

     }

}

?>

说明

上面的代码是什么意思?让我们看仔细一点。

function xoops_module_install_myModule(&$module)

 

Xoops安装一个模块时,会在我们安装后的脚本中找一个叫做xoops_module_install_<module directory>的函数。如果找到这个函数就会运行它,为我们最近安装的模块的xoopsModule对象提供一个参考。如果Xoops找不到这个文件或里面的函数,那么模块的初始化例行程序会再次重新出现并且继续执行。

返回结果

在结束了初始化任务后,如果成功函数应该返回ture,否则返回false。如果返回ture你应该在安装上看到这个信息:

xoops_module_install_myModule executed successfully.

 

如果返回false你将看到:

Failed to execute xoops_module_install_myModule

 

同样,阻止从安装函数发出输出状态信息。这些信息不在页面信息流显示,但可能在管理标题上——不是正好是你得到的。

卸载

记住用户可能想要卸载你的模块。一个拥有良好性能的模块会在安装前保证系统可以找到卸载。

如果区块,组权限,模板,通知,sql表格和其他资料是自动(而且完全)卸载,你必须手动卸载你在安装后的脚本中添加的东西。

设置

在你的xoops_version.php文件中加下面这行

$modversion['onUninstall'] = 'uninstallscript.php';

 

它完全像安装脚本一样工作。在和xoops_version.php同一目录下创建文件uninstallscript.php

<?php

 

function xoops_module_uninstall_myModule(&$module)

{

}

?>

 

 

现在你可以适当的卸载你的安装后的脚本工作。在卸载过程中,你会得到下面的记录信息:

xoops_module_uninstall_myModule executed successfully.

如果你的函数返回ture,若是返回false

Failed to execute xoops_module_uninstall_myModule

 

6.4.4. Xoops全局变量

每次读取一个Xoops页面时,一些全局变量被自动定义并可在你的模块中使用。注意这些不是对象就是数组。

特别是每个数组,每个可用的元素都被被列出、描述。对每个对象,成员变量(通过$object->getVar('varname')得到)都应被描述。以及任何可得到的方法。注意'getVar'获取一个可选的二次变元[立刻被描述]

$xoopsUser

若当前访问者注册了的话,这是显示当前用户的对象。(若没注册,这个变量将不被定义。)

例如:

  • $xoopsUser->getVar('uname') – 获取用户名
  • $xoopsUser->getVar('uid') – 获取用户ID
  • $username = !empty($xoopsUser) ? $xoopsUser->getVar('uname') : $xoopsConfig['anonymous'];
  • $userid = !empty($xoopsUser) ? $xoopsUser->getVar('uid') : 0;

 

$xoopsDB

这是显示Xoops数据库的对象。如果数据库没有正确初始化,这个变量不被设置。

例如:

  • $xoopsDB->query($sql) – 执行查询
  • $xoopsDB->prefix($table) –在表格名称前加上管理员选择的前缀

 

$xoopsConfig

 

$xoopsConfig (Xoops Global Variable)

这个数组包含了Xoops的配置信息。通过$xoopsConfig['name_of_config_option']'name_of_config_option'里访问其值。如下所示(不完全列表):

  • 'language' – 当前语言
  • 'anonymous' – 匿名用户名称
  • 'theme_set' – 当前设置的主题名称
  • 'template_set' – 当前设置的模板名称
  • 'sitename' – 站点名称
  • 'slogan' – 站点标题
  • 'adminmail' – 站点管理员电子邮件地址
  • 'root_path' – XOOPS_ROOT_PATH."/"一样
  • 'xoops_url' – XOOPS_URL一样
  • 'closesite' – 若站点被关闭则设为1
  • 'closesite_text' – 当你的站点被关闭时对用户显示的信息
  • 'theme_fromfile' – 当设为1时,xoops自动检测你的主题文件是否已经更新;若是,数据库模板被更新
  • 'anonpost' – 设为1则匿名用户可发表评论
  • 'use_ssl' – 告诉xoops用户登陆是否加密
  • 'sslpost_name' -
  • 'debug_mode' – 不同的数字代表调试模式是否打开
  • 'com_order' – 邮件的排序(升序或降序)
  • 'com_mode' – 邮件查看方式 (ThreadedFlat)
  • 'enable_badips' – 如果IP可被禁止
  • 'badips' – 被禁止的IP列表
  • 'use_mysession' – 如果允许客户会话
  • 'session_name' – 客户会话名称(只在use_mysession为真时才设置)
  • 'session_expire' – 客户会话截止时间(只在use_mysession为真时才设置)
  • 'default_TZ' -

 

这是包含Xoops配置信息的数组。

例如:

  • $xoopsConfig['language'] – 当前语言
  • $xoopsConfig['anonymous'] – 匿名用户名称
  • $xoopsConfig['theme_set'] – 当前设置的主题名称

 

$xoopsModule

这是显示当前模块的对象。如果当前在系统模块,这个变量不被定义。

例如:

  • $xoopsModule->getVar('dirname') – 获取当前模块的目录名称 (XOOPS_ROOT_PATH . '/modules/' . $xoopsModule->getVar('dirname'))

 

$xoopsModuleConfig

这是包含了当前模块配置选项的数组。这些值由管理员为模块列在$xoops_version.php中的选项设置。若模块支持内部评论或通知特性,一些附加的[要被描述的]选项包含在这。

$xoopsTpl

这是显示当前页面模板的对象。

例如:

  • $xoopsTpl->assign('varname', $value) – smarty模板中给变量分配一个值

 

$xoopsRequestUri

 

$xoopsOption

这是显示一些特殊的Xoops选项的数组。

$xoopsLogger

 

6.4.5. 表格结构模块开发

这个指南将带领你建立一个简单的XOOPS模块,包含一个表单及提交表单时的动作。该指南在很大程度上基于CoolPopsKickstart指南和触点模块。

在你开始前

你应该:

·         已经安装一个 Xoops 系统 ,而且能够正常运行

·         已经熟悉 Xoops 模块安装的方法

·         知道如何编写 PHP 语言 http://www.php.net

·         了解 SQL (如果你的模块需要存取数据库) http://www.mysql.com

·         了解Smarty模板工具箱(templating toolkit)的基本知识 http://smarty.php.net (那里提供了不错的速成课程)

·         请参考阅读: XoopsCodingStandardsModuleNamingConventions 以及 ModuleBasicStructure

 

样式说明书

我们的模块的目标是显示一个简单的表单,然后返回提交的数据。

  • 模块名: Form Test
  • 模块目录: formtest

 

模块必须

  • 在主菜单上显示它本身
  • 支持多种语言
  • 显示一张表单,然后在提交时显示输入值。

目录结构

当您已经阅读过 ModuleBasicStructure,我假设你已经用骨架代码把目录结构都建好了。如果还没有,现在就请阅读一下 ModuleBasicStructure。我所创建好的结构看起来就像如下的样子:

  • XOOPS_ROOT/modules/greeter
    • language
      • english
    • templates

 

注意:在以下的描述中,当我给出一个目录名或文件名时,除非有明确地表述,否则它们都对应于XOOPS_ROOT/modules/ formtest

XOOPS 版本信息

创建一个文件 /xoops_version.php 其程序代码内容如下:

<?php

//版权信息,说明,等等……放在这里

$modversion['name'] = _MI_FORMTEST_NAME;

$modversion['version'] = 1.00;

$modversion['description'] = _MI_FORMTEST_DESC;

$modversion['credits'] = '';

$modversion['author'] = '&lt;insert name&gt;';

$modversion['license'] = 'GPL see LICENSE';

$modversion['official'] = 0;

$modversion['image'] = 'formtest_slogo.png';

$modversion['dirname'] = 'formtest';

 

//管理

$modversion['hasAdmin'] = 0;

$modversion['adminmenu'] = '';

 

//菜单

$modversion['hasMain'] = 1;

 

//模板

$modversion['templates'][1]['file'] = "formtest_form.html";

$modversion['templates'][1]['description'] = "Test Form";

$modversion['templates'][2]['file'] = "formtest_read.html";

$modversion['templates'][2]['description'] = "Read back form data";

?>

说明

这个文件是模块安装过程,在其他的事情之中。

上述的文件是相当容易了解的﹐但是我还是要说明一些项目。

 

_MI_ ... ? 那是什么?

任何以 _MI_ 为前缀的词,都是在 /language/schinese/modinfo.php语言文件里面定义的。 我们马上会创建这个文件,但是现在,我们只要知道,这是模块信息,它将被及时显示在用户眼前;在这种情况下,它只在管理员安装或管理时显示。因此需要在语言文件里事先定义。

模板

模板(Templates)会在模块安装时被编译,而且保存在数据库中。 因此,你必须让系统知道你将会使用到的每个模板。

模块信息语言文件

编辑 /language/schinese/modinfo.php 而且将下列内容放入其中。

<?php

//模块名称

define("_MI_FORMTEST_NAME", "FORM TEST");

//模块的简短描述

define("_MI_FORMTEST_DESC", "A simple module to demonstrate creating forms in XOOPS.");

?>

说明

稍后我们将会把较多的信息加入这个文件里,但是它仍然是一样的语法;非常容易的。 现在如果我们想要增加一个法语的语言文件,我们要做的只是创建 /language/english/modinfo.php,然后放上相同的定义,不过这些定义要改为法语。 现在如果某人在法语的语系中使用此系统,Formtest会以他们的语言来显示它的名字和描述。

一个简单的小帮手

以如下的内容,创建 /header.php

<?php

require('../../mainfile.php');

?>

说明

初始化XOOPSSMARTY引擎。

最主要的文件,index.php

这将控制页面布局。

 

<?php

//表单未填写,一定是第一个访问这样显示的表单

if (empty($_POST['submit'])) {

// 初始化XOOPSSMARTY

include "header.php";

//开始页面 初始化系统缓存

include XOOPS_ROOT_PATH."/header.php";

// 设置模板文件

$xoopsOption['template_main'] = "formtest_form.html";

// 获取表单创建类

include_once XOOPS_ROOT_PATH."/class/xoopsformloader.php";

// 包含你的表单的逻辑文件

include "formtest.php";

// 传送表单到SMARTY

$test_form->assign($xoopsTpl);

// 结束页面

include XOOPS_ROOT_PATH."/footer.php";

 

} else { // 表单被提交,让我们来演示返回

require("header.php");

require(XOOPS_ROOT_PATH."/header.php");

$xoopsOption['template_main'] = "formtest_read.html";

// 从表单发送变量到SMARTY来输出

$xoopsTpl->assign('itemName', $_POST['itemName']);

$xoopsTpl->assign('itemDesc', $_POST['itemDesc']);

require(XOOPS_ROOT_PATH."/footer.php");

}

?>

说明

要点这可以在论坛中找到!为了适当的实现XOOPS系统范围的缓存,在主模板被赋值前必须进入XOOPS_ROOT_PATH."/header.php"

这个文件有两部分。在检查提交按钮是否点击后,两张页面之一被创建。如果它还没被点击,那么这页面是第一次被访问,而且表单文件被显示的SMARTY模板赋值。如果它已经被点击过了,那么变量$_POST被插入显示的SMARTY模板。

$xoopsTpl

这是另一个变量,当程序引用了 /header.php 时就自动产生了。它也是Smarty类。 Smarty文档中定义 $xoopsTpl 变量为 $smarty 它只是你在 $xoopsOption['template_main'] = 'formtest_form.html '$xoopsOption['template_main'] = 'formtest_read.html' 模板中所创建的 Smarty类。

 

XOOPS_PATH.'/header.php' XOOPS_PATH.'/footer.php'

主页面headerfooter。在这里你要知道的重要一点是:

1. 你必须将它们包含进来

2. 在还没把XOOPS_PATH.'/header.php'包含之前,你不能使用$xoopsTpl

3. 所有$xoopsTpl操作必须在两个require(或include)语句之间完成

 

formtest.php

这是程序逻辑文件。我们可以在里面定义表单部分。

说明

有三个步骤:

1.使用XOOPS表单类来创建表单的元素。

2. 建立一个表单对象。

3. 将你的元素加入到这个表单。

 

/language/schinese/main.php

<?php

define("_FT_NAME", "Item Name");

define("_FT_DESC", "Item Description");

define("_FT_SUBMIT", "Submit");

define("_FT_TESTFORM", "Test Form");

?>

 

说明

在这个文件中我们定义所有在主要文件中的标题、提示、头部、或其他系统文本输出的变量。像modinfo.php,这个文件使得为站点提供不同的语言变的容易。

 

/templates/ formtest_form.html

这个文件是个真实的Smarty 模板文件。

说明

重要说明 Xoops 世界中,所有的Smart 程序代码的Smarty标签都是 <{...}> 而不是像Smartys速成课程中所说的 {...} 标签。 {...} 是无法在XOOPS里工作的。请牢记!

首先,一个普通的动态创建的检测表单的javascript是嵌入的。然后表单打开开始显示表格。表单元素插入到一个XOOPSSMARTY前部的循环中。这种方式在不需要接触到HTML模板文件的情况下方便的添加或移动表单元素。表格的外观套用站点的主要CSS文件,所以,模块看上去像静态的站点。

/templates/formtest_read.html

条目名称: <{$itemName}><br>

条目描述: <{$itemDesc}>

说明

<{$itemName}>通过/index.php, $xoopsTpl->assign('itemName', ...);.中的命令来获取赋值,<{$itemDesc}>也同样如此。如果你想改变页面外观,更改HTML代码而不用改变XOOPS/SMARTY标签。例如:

<table class="outer" cellspacing="1">

    <tr>

    <th colspan="2">Form Output</th>

    </tr>

    <tr>

        <td class="head">Name</td>

        <td><{$itemName}></td>

    </tr>

    <tr>

        <td class="head">Description</td>

        <td><{$itemDesc}></td>

    </tr>       

</table>

注意

如果你只看到一张空白页,你应该试着更新模块。只要你更改了代码你就必须更新模块。进入System Admin --> Modules,点击formtest module旁边的'update module'按钮。如果还是显示空白页,就返回检查,这是一项艰苦的工作。尤其要检查文件xoops_version.php

 

希望这能有帮助。

6.4.5.1. 从数据库读取挑选的选项

这是一个从数据库顺着向下读取表单选项方面的快速课程

我们有一个含有叫"categories"表格的数据库,我们想要顺序向下的向数据库中填写分类。下面是应该怎么做:

 

// 必须包含Xoops and Smarty初始信息,包含数据库接口……

 

include "../../mainfile.php";

 

//……及表格的产生。

 

include_once XOOPS_ROOT_PATH."/class/xoopsformloader.php";

 

// 查询数据库和读取一组有结果的数组

 

$results = $xoopsDB->query("SELECT `category` from ". XOOPS_DB_PREFIX ."_categories");

 

while ($opt = $xoopsDB->fetchArray($results)) {

 

    // 创建选项数组

 

    $options[] = $opt['category'];

 

}

 

//XoopsFormSelect类创建表单元素

 

$category_select = new XoopsFormSelect(_MY_SELCAT, "categories");

 

// 添加从数据库提取的选项数组

 

$category_select->addOptionArray($options);

 

// 创建一个提交按钮

 

$submit_button = new XoopsFormButton("", "submit", _MY_SUBMIT, "submit");

 

// 创建新的表单对象

 

$my_form = new XoopsSimpleForm(_MY_MYFORM, "myform", "myform.php"); // default method is POST

 

// 添加元素到表单

 

$my_form->addElement($category_select);

$my_form->addElement($submit_button);

 

注意:

_MY_SELCAT和所有其他常数元素标题在文件language/english/main.php中被定义(或无论你使用什么语言)

在你的模板html文件顺序向下显示:

<form name="<{$myform.name}>" enctype="multipart/form-data" action="<{$myform.action}>" method="<{$myform.method}>" <{$myform.extra}>>

 

<table>

    <tr>

        <th><{$myform.elements.categories.caption}></th>

        <td><{$myform.elements.categories.body}></td>

    </tr>

    <tr>

        <td colspan="2"><{$myform.elements.submit.body}></td>

    </tr>

</table>

 

</form>


  
  
   
    
  
  

6.5. 使用Xoops应用程序接口

除了Xoops API文档编制,我们还需要模块作者的指导方针,关于使用什么类、何时使用、为什么使用和怎样使用等等。

例如:

XoopsObject数据存取类

如果你创建一个由XoopsObject扩展得来的模块类(在你的模块中的类文件夹中)叫做<Module>MyClass


  
  
   
    
  
  
class ModuleMyClass extends XoopsObject
   
   
{
   
   

  
  
   
    
  
  
    /**
   
   
     * Constructor
   
   
     **/
   
   
          function ModuleMyClass()      // 构造函数
    
    
          {
   
   
                    $this->initVar('my_variable', XOBJ_DTYPE_INT, NULL);
   
   
          }
   
   
}
   
   

  
  
   
    
  
  

和一个由XoopsObjectHandler扩展得到的叫<Module>MyClassHandler的句柄:

class ModuleMyClassHandler extends XoopsObjectHandler

{

 

    

}

 

你可能得到一个像这样的句柄类实例的参考:

In /modules/module/index.php:

 

$myclasshandler = &xoops_getmodulehandler('MyClass');

 

内部的数据对象句柄可以通过xoops_gethandler('<class>')获得。

找寻这个习惯语法在其他模块中的使用,以知道这些类让你建立数据访问对象对应相应数据库表的接口的方法。
    
    

  
  
   
    
  
  

6.6. 使用XoopsForm

6.6.1 介绍

表单函数创建看来似乎在XoopsForm类层次中(在文件中的位置:Program_Root/class/xoopsform/form.php

XoopsSimpleForm

表单输出一个简单的最小格式的HTML表单。

XoopsTableForm

表单输出HTML表格格式的表单。

XoopsThemeForm

表单输出一个允许设置主题的HTML表格。

dform,例如:$form=new XoopsThemeForm(...)。跟着的是构造和设置不同的表单元素(XoopsFormText, XoopsFormCheckBox, 等等。),这些表单元素是将要添加进表单的。例如:$form->addElement(...)。它将用$form->display()显示。它看上去象具有代表性的XoopsFormHidden的隐藏元素决定提交的表单在后面的过程是如何使用的。添入表单变量并被存入数据库,例如:通过句柄类。

6.6.2 XoopsForm

想要对XoopsForm类有更深入的认识,请参考dev wiki


  
  
   
    
  
  

6.7. XML远程过程调用

综述

XOOPS提供XML-RPC接口,它允许与XOOPS进行多种服务和工具的交流。

XOOPS提供除了setTemplate/getTemplate以外的所有Blogger API方法,所有metaWeblog API方法,和源自可用的moveabletype API的一种方法。XOOPS同样有它自己的API,可以用作操作邮件和分类。

 

在你的XML-RPC调用中使用下列的基本主机信息:

  • 主机: www.yourhost.com
  • 路径: /xmlrpc.php
  • 端口: 80
支持方法

以下是XOOPS通常支持的XML-RPC方法:

注意:下面的返回值是成功时返回的值。失败时所有的方法都将返回故障。

 

blogger.newPost

  • 描述:发送一个新的条目。管理员可以随意的直接发布邮件。
  • 参数:String appkey, String blogid, String username, String password, String content, Boolean publish
  • 返回值:新邮件的String postid

 

blogger.editPost

  • 描述:编辑一个现有的条目。管理员可以随意的直接发布邮件。
  • 参数:String appkey, String postid, String username, String password, String content, Boolean publish
  • 返回值:布尔型真值

 

blogger.deletePost

  • 描述:删除一个现有的条目,只有管理员可以操作。
  • 参数:String appkey, String postid, String username, String password, Boolean publish
  • 返回值:布尔型真值

 

blogger.getPost

  • 描述:重新得到一个指定条目的信息。
  • 参数:String appkey, String postid, String username, String password
  • 返回值:结构包含String userId, String content, ISO.8601 dateCreated, String postid

blogger.getRecentPosts

  • 描述:重新得到最近发送条目的指定编号。
  • 参数:String appkey, String blogid, String username, String password, Int numberOfPosts
  • 返回值:结构数组包括ISO.8601 dateCreated, String userid, String postid, String content

blogger.getUsersBlogs

  • 描述:返回用户可以发送的日志的信息。
  • 参数:String appkey, String username, String password
  • 返回值:结构数组包括String url, String blogid, String blogName

blogger.getUserInfo

  • 描述:返回用户信息。
  • 参数: String appkey, String username, String password
  • 返回值:结构包括String userid, String firstname, String lastname, String nickname, String email, String url

 

metaWeblog.newPost

  • 描述:发送一个新的条目。管理员可以随意的直接发布邮件。
  • 参数:String blogid, String username, String password, Struct content, Boolean publish
  • 返回值:新邮件的String postid

 

metaWeblog.editPost

  • 描述:编辑一个现有的条目。管理员可以随意的直接发布邮件。
  • 参数:String postid, String username, String password, Struct content, Boolean publish
  • 返回值:布尔型真值

 

metaWeblog.getPost

  • 描述:重新得到一个指定条目的信息。
  • 参数:String postid, String username, String password
  • 返回值:结构包括String userid, ISO.8601 dateCreated, String postid, String description, String title, String link, String permaLink

 

metaWeblog.getRecentPosts

  • 描述:重新得到最近发送条目的指定编号。
  • 参数:String blogid, String username, String password, int numberOfPosts
  • 返回值:结构数组包括ISO.8601 dateCreated, String userid, String postid, String description, String title, String link, String permaLink

metaWeblog.getCategories

  • 描述:返回用户可以发送的日志中的分类的信息
  • 参数:String blogid, String username, String password
  • 返回值:结构数组包括String description, String htmlUrl, String rssUrl

mt.getCategoryList

  • 描述:返回用户可以发送的日志中的分类的信息
  • 参数:String blogid, String username, String password
  • 返回值:结构数组包括String categoryId, String categoryName

 

xoops.newPost

  • 描述:发送一个新的条目。管理员可以随意的直接发布邮件。
  • 参数:String blogid, String username, String password, Struct content, Boolean publish
  • 返回值:新邮件的String postid

 

xoops.editPost

  • 描述:编辑一个现有的条目。管理员可以随意的直接发布邮件。
  • 参数:String postid, String username, String password, Struct content, Boolean publish
  • 返回值:布尔型真值

xoops.deletePost

  • 描述:删除一个现有的条目,只有管理员可以操作。
  • 参数:String appkey, String postid, String username, String password, Boolean publish
  • 返回值:布尔型真值

xoops.getPost

  • 描述:重新得到一个指定条目的信息。
  • 参数:String postid, String username, String password
  • 返回值:结构包括String userid, ISO.8601 dateCreated, String postid, String description, String title, String link, String permaLink

xoops.getRecentPosts

  • 描述:重新得到最近发送条目的指定编号。
  • 参数:String blogid, String username, String password, Int numberOfPosts
  • 返回值:结构数组包括ISO.8601 dateCreated, String userid, String postid, String description, String title, String link, String permaLink

xoops.getCategories

  • 描述:返回用户可以发送的日志中的分类的信息
  • 参数:String blogid, String username, String password
  • 返回值:结构数组包括String categoryId, String categoryName, String categoryPid

 

错误代码

下面是错误代码和信息的列表,当出错时返回的故障响应。

  • 101 – 无效、非法的服务器URI
  • 102 – 语法分析错误
  • 103 – 找不到模块
  • 104 – 用户身份验证失败
  • 105 – 找不到模块API
  • 106 – 方法响应错误
  • 107 – 不支持方法
  • 108 – 无效、非法的参数
  • 109 – 遗漏参数
  • 110 – 选择的日志应用程序不存在
  • 111 – 拒绝方法的权限

 

客户端软件
下面是一些推荐的可用与XOOPS交流的XML-RPC顾客软件列表:
    
    
  • w.bloggar只在Windows环境下使用,推荐3.0或更高版本
  • BloGTK - GNU/Linux环境,1.0版本工作很好
Smarty Values

<{$xoops_isuser}> - 1 if user is logged in, 0 if anonymous user

<{$xoops_uname}> - User name

<{$user_method}> - Logged in user's preferred notification method

<{$xoops_isadmin}> - 1 if admin, 0 if not (Admin rights to System module is the deciding factor - no other modules are considered)

<{$xoops_userid}> - User's ID

<{$xoops_charset}> - Charset used on the page, e.g. ISO-8859-1

<{$xoops_langcode}> - language code used for page (e.g. en for English)

<{$xoops_sitename}> - Site Name

<{$xoops_slogan}> - Site Slogan

<{$xoops_pagetitle}> - Page Title

<{$xoops_version}> - Xoops Version

<{$xoops_theme}> - Name of theme folder

<{$xoops_themecss}> - URL to theme's css file

<{$SCRIPT_NAME}> - path to file name requested from xoops root (e.g. modules/news/index.php)

<{$xoops_imageurl}> - URL to theme folder

<{$xoops_requesturi}> - requested url (e.g. /modules/news/article.php?storyid=1)

<{$xoops_rootpath}> - path to xoops root

<{$xoops_upload_url}> - URL to xoops uploads directory

<{$xoops_url}> - URL to xoops root

xoopsConfig is an array.

Array
(
$xoopsOption['sitename'] => the name of the Site
$xoopsConfig['slogan'] =>
$xoopsConfig['adminmail'] =>
$xoopsConfig['language'] => language
$xoopsConfig['startpage'] => start modulename
$xoopsConfig['server_TZ'] => 1
$xoopsConfig['default_TZ'] => 1
$xoopsConfig['theme_set'] =>
$xoopsConfig['theme_fromfile'] => 1
$xoopsConfig['theme_set_allowed'] => Array

(

$xoopsConfig['0'] => Themename 1

)

$xoopsConfig['template_set'] => default
$xoopsConfig['anonymous'] => Anonym
$xoopsConfig['gzip_compression'] => 0
$xoopsConfig['usercookie'] => xoops_user
$xoopsConfig['use_mysession'] => 0
$xoopsConfig['session_name'] => xoops_session
$xoopsConfig['session_expire'] => 60
$xoopsConfig['debug_mode'] => 1
$xoopsConfig['banners'] => 1
$xoopsConfig['closesite'] => 0
$xoopsConfig['closesite_okgrp'] => Array

(

$xoopsConfig['0'] => 1

)

$xoopsConfig['closesite_text'] =>
$xoopsConfig['my_ip'] => 127.0.0.1
$xoopsConfig['use_ssl'] => 0
$xoopsConfig['sslpost_name'] => xoops_ssl
$xoopsConfig['sslloginlink'] => https://
$xoopsConfig['com_mode'] => nest
$xoopsConfig['com_order'] => 0
$xoopsConfig['enable_badips'] => 0
$xoopsConfig['bad_ips'] => Array

(

$xoopsConfig['0'] => 127.0.0.1

)

$xoopsConfig['module_cache'] => Array

(

$xoopsConfig['2'] => 0
...
...

)

$xoopsConfig['xoops_url'] =>
$xoopsConfig['root_path'] =>
)

$xoopsOption is an array of options used by XOOPS in some aspects to show the page correctly.

E.g. $xoopsOption['template_main'] sets the template to be used in the main contents (module output area)

$xoopsOption['theme_use_smarty'] is a setting to determine whether the theme uses smarty or not.

$xoopsOption['pagetype'] can be either admin or user and determines which language files are included, admin or user.

$xoopsOption['nocommon'] if set to 1 will not include common.php

There are a few more to disable certain blocks, if you should desire that, but I have rarely found a reason to do so. The most used is $xoopsOption['template_main'].

 

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值