|
drupal7教程-创建模块系列一:drupal模块教程前言 本教程将会教你如何在drupal7下创建一个模块-module 模块(module):指的是一系列函数的集合体,模块将drupal连接起来,并且在drupal安装时提供了附加的功能。读完这个教程,你将可以建立一个基本的block模块,并且可以把它当做更多高级模块的一个模板。 这个教程不准备教你为公共的发布程序写模块。教程也不会包括缓存,或者权限、代码安全方面的议题。这个教程仅仅作为一个切入点,可以扩展你用其他资源的技能。 本教程假设你掌握了以下方面的知识 基本的PHP知识,包括语法和一些PHP对象的概念+ \* p# s; T x7 N9 m+ k
基本的关于数据表,数据字段,数据记录和SQL语句的相关知识: v$ o- b& q3 ]; ^
安装好一个drupal7
; D9 J+ e# e1 j" g) D. kdrupal的超级管理员权限( S9 m' p* I, F1 C+ c8 _
可以访问web服务 本教程假设你没有drupal模块方面的认识知识。
, u R8 i1 S8 X" y1 N& |" J' e M6 p# B* z9 L/ @( o- y; A& S" e
drupal7教程创建模块系列二:开始创建模块 摘要:模块文件名和模块所在位置本系列介绍怎么创建一个初始的模块文件和目录。命名你的模块创建模块的第一步是先给模块起一个简称。这个简称因为将要用在你模块所包含的所有文件和函数里面,所以,简称必须以字母开头,并且只能包括小写字母和下划线。对于本教程,我们将选择"current_posts"作为模块简称。注意:你一定要遵守这些建议,不要用大写字母在你的模块简称里,因为模块简称将用于模块的文件名字和某个函数的前缀。当你执行一个drupal钩子(钩子将会在后面的教程里介绍)的时候,drupal将会认出你的钩子函数,如果这些钩子跟模块文件名有相同的函数名前缀。还有一点也很重要,就是你的模块的简称不能跟任何你站点正在用的主题有相同的简称。创建一个文件夹和一个模块文件由于我们选择的模块简称是"current_posts", 开始创建模块时,我们需要现在drupal安装路径下创建一个文件夹:sites/all/modules/current_posts。在sites/all/modules/current_posts文件夹里创建一个PHP文件,并且将文件命名为current_posts.module。注意,drupal不会用.php扩展名。drupal非常清楚.module文件使用php写的。在drupal6版本时,sites/all/modules文件夹里放得都是非核心的模块(类似,sites/all/themes文件夹里放的也是非核心主题),从那以后,这个文件夹就放置所有非核心文件。这样做的好处就是,你更容易更新你的核心文件和模块而不必清理你自己定制的模块和文件。并且,当你有一个多站点drupal安装时,这个模块只用于一个特别的站点,你也可以将模块放置到sites/your-site-folder/modules。模块文件以PHP标签开始,不再设置CVS的ID标签在你的模块里。因为drupal.org已经将版本控制系统改为了Git。如果编码的模块给你一个错误的提示信息关于CVS的,那说明模块还没有更新到drupal.org的Git版本系统中。<?php这个模块目前还没有运行,因为模块没有被激活。我们将在后面的教程中激活模块。编码的标准根据编码标准,不要写闭合标签 ?> 。包含闭合标签可能引起一些奇怪的运行时问题在某些特殊服务建立的时候。所有的被直接用在drupal模块里的函数都是被命名为{modulename}_{functionname}的钩子,这里的functionname是一个预定义的函数名后缀。drupal将运行这些函数得到特殊的数据,因此,有了这些定义好的函数名字,drupal就知道哪里去找这些函数。我们一会将介绍钩子。
! I( f& X& g* O! K2 D; k+ Z5 H3 ]7 s
drupal7教程-创建模块系列三:告诉drupal你的模块信息 摘要:.info文件所有的模块必须有一个'modulename.info'文件, 它包含了模块的基本信息。一般的格式如下:name = Module name * U( p8 i" ?6 N0 p% [! g
description = A description of what your module does.
5 l% U8 _# O' f1 v# s. |, k9 w6 Ecore = 7.x对于我们教程中的实例的模块,我们将用current_posts来代替modulename。如果没有.info文件,模块不会显示在模块列表里。以下是实例模块的内容name = Current posts - \: g( j1 y9 L; U2 t. J8 e
description = A block module that lists links to recent posts.core = 7.x增加一个名字为current_posts.info的源文件,并且将此文件放在目录sites/all/modules/current_posts下。注意:如果你拷贝或者粘贴这个上面的代码,要确保描述数据中不包含换行。否则,.info文件不会被正确解析。.info文件的细节name (必须)
- O% v; ~' n3 H' S显示你模块的名字。它应该遵循drupal的写法标准:仅仅第一个单词的第一个大写字母是大写的((比如:"Example module", 而不是 "example module" 或"Example Module")。
# W; y& o% t1 Q. c! _ Ename = Current postsdescription (必须)
% |; ?1 K: ]0 V \& ~一个简洁、合适的描述可以告诉管理员这个模块是起什么作用的。过长的描述会使管理页面很难看,因此请尽量简洁。这个字段长度限制在255个字符。description = A block module that lists links to recent posts.描述也可以链接到文档或者源码。下面的例子展示了链接到作者。它也能链接到Drupal.org的一篇文章。有时候,在线文档其实比readme文件更有好处。description = Domain manager by <ahref=" http://5iphp.com">5iphp.com</a>.core (必须)
) O F6 n6 j$ |$ n8 M你的模块为哪个drupal版本开发。对于drupal7,核心应该是7.x。注意:模块不能写成某个特殊的某个druapl分支的小版本。比如7.x是正确的,而7.2则是不正确的。 2 N4 G! i/ y' P( U2 Y E
core = 7.xfiles (可选) 4 l, Z! A+ j. N
drupal现在支持动态代码载入注册。为了支持这个功能,所有的模块必须在.info文件中声明一个包含类和接口描述的代码文件。比如
# c5 r/ @9 |1 N5 G$ {8 ?name = Example module - I& g+ W6 A% w. P# R; ^% Y0 R% Q
description = "Gives an example of a module."
^4 ^5 |( `7 d" ?- [5 t... g G6 J- W) ]4 v
files[] = example.test 0 z: W4 J) r8 j; M8 B# p
当一个模块被启用,drupal将重新扫描所有生命的文件,并且索引所有它发现的的类和接口。当有权限的时候,这些类会自动被PHP载入。dependencies (可选)
, x2 |. B& D9 K4 W: K有许多的额外选项会出现在.info文件里。其中之一就是dependencies。如果一个模块的启用依赖于另一个模块,用如下的语法结构列出所有依赖的模块 2 F& c& ?; _; R2 M: f {
dependencies[] = taxonomy
* q, t' ^* f- k" ydependencies[] = comment
, H2 K e ^, U对于示例模块,这个选项没有被用到,我们就没有写。如果dependencies被设置,则所有依赖模块被启用以后,你的模块才能启用。package (可选) $ w( E1 C9 C3 Z# A' a' A6 w$ z
如果一个模块有一个package字符,在admin/build/modules页,它将和其他有相同目录的模块列在一起。如果package字符没有设置,模块将被列在“其他”这个目录下。如果你的模块不是非常的完美,不要单独的设置一个package字符。如果拿不定是不是要作为一个package,那么就让这个字段留空。 4 s% K6 _' U8 V0 O, b: U
package = "Your arbitrary grouping string" q4 ^* h: g1 s& ?# h7 D
建议package字段用下面列表里的名字
; Y' N4 U' c# U+ s, z/ X Administration 2 \9 b5 }1 Y0 F
Commerce
! e8 N' S8 u4 R" k; Q Development
5 t9 K7 a, S# Q& H1 M0 p% ]- V Fields ' J+ X. H0 ?0 w6 t: a- q
Media
; ]" e% ?4 P5 I User interface $ o4 ?0 M6 g! `1 F& U- W) }
Views
8 |& O0 }% d5 P4 y5 z4 ?* \ Voting (if it uses/requires VotingAPI).info文件还有一些其他很少被用到的选项,在本教程中就不提了。如果想得到更多的细节,请参考 http://drupal.org/node/542202检查:
1 {1 h! Q ^9 p/ _8 k/ f2 g你的模块现在应该出现在模块列表里了。去“模块”菜单并拉到列表的底部,产看"其他"目录。你可以看到模块Current posts。 , |+ y' W! J+ `' q+ y
0 `5 M2 q' l6 P# Gdrupal7创建模块教程系列四:写注释并开始写你的第一个钩子函数
Drupal钩子(hook)描述: hook_help()+ ?5 ^/ h( P# A* e* P+ X* y$ `# @
在drupal模块中写注释4 v! ?5 Q8 {! M8 Q6 w4 W
在模块中写注释是一个好习惯。下面的注释对于任何看到你代码的人都会感觉很清晰。1 D# [; F& T, d6 V
<?php G- e- p2 @$ C0 {6 q4 w0 [9 M
/**. s) X) V I! q% c& m( W
* @file0 r- `9 P; u& w8 A& H. K/ B
* A block module that displays recent blog and forum posts., C4 v5 L, ~$ t- {' _+ Z2 i, q
*/
5 @3 Q3 D0 W ~% o) g! F5 n?>" m8 b* J& B: m8 S7 t' ?2 A I0 m( X4 J
@file 意味着这段注释是针对整个文件的。
& ~/ Q- Z E. u1 c/ H% M8 ~ |