-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathDrupal7 Module.txt
466 lines (452 loc) · 26.5 KB
/
Drupal7 Module.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
start in 2012.2.7 end in 2012.2.29
------------------------PHP---start------------------------
(PHP简明教程.doc)
语法:
<?php......?>
<?......?>
require("file.php");//通常放在最前面,执行前读入
include("file.php");//一般放在流程控制的处理部分中,执行到时读入
<?php
echo "string;\n";//注释内容
/*注释内容*/
echo "string;\n";#注释内容
?>
$str = "string";
$line = "string\n";
$int1 = 38;
$float1 = 1.732;
$float2 = 1.4#+2;
$array1 = array("1", "2", "a", "b", "c");
+、-、*、/、%、++、--
$a = "aaa";
$b = "bbb";
echo $a.$b;//"."号连接字符串
<、>、<=、>=、==、!=、&&、and、||、or、xor、!
if(expr){statement}//单行可省略大括号
if(expr){statement}else{statement};
if..else if...else...
for(expr1; expr2; expr3){statement};
switch(expr){case expr1:statement1;break; case......;default:statementN;break;}
$obj->username;
$_POST['html_id'];//提取POST过来的数据
$_GET['html_id'];//提取GET过来的数据
数据库:
mysql_connect(string[hostname][:port], string[username], string[password]);
mysql_select_db(string[database_name], int[link_identifier]);
mysql_query(string[query], int[link_identifier]);
mysql_fetch_object(int[result], int[result_typ]);//遍历查询结果
SESSION:
session_start();//开启SESSION
$_SESSION['item'] = "item1";
$item1 = $_SESSION['item'];
empty($_SESSION['inum']);//inum是否为空
echo "<script>alert('Password Check Error!');location.href='login.php';</script>";
ceil($num/10));
<a href="xxx.php?page=<?=($page-1)?>">PrevPage</a>
<a href="xxx.php?page=<?=ceil($num/10)-1?>">LastPage</a>
上传文件和发送邮件:
表单必须加上enctype="multipart/form-data"和<input type="file" name="file">
$f = & $HTTP_POST_FILES['file'];
$dest_dir = 'uploads';//设定上传目录
$dest = $dest_dir.'/'.date("ymd")."_".$f['name'];//设置文件名为日期加上文件名避免重复
$r = move_uploaded_file($f['tmp_name'], $dest);//这个函数是关键
chmod($dest, 0755);//设定上传的文件的属性
mail("收件人地址", "主题", "正文", "From:发件人\r\nReply-to:发件人的地址");
------------------------PHP----end-------------------------
------------------------Drupal 7 Module---start------------------------
一、介绍
使用procedural programming(过程式编程)方式开发
Drupal modules由函数集组成
Drupal core libraries
Drupal hooks
Drupal core modules
The Database
The theme system
Drupal's major subsystems
(Theme,Menus(树状结构),Nodes(类似文本结构),Files,Users,Comments,
Fields and entities,Forms API,Installation Profiles,
Simple test,Blocks,Other subsystems)
二、简单模块
一个module有两个名字:human-readable name和machine-readable name
名字的大写会转换成小写
/modules目录只给核心Drupal模块保留,每次更新会被重写
/sites/all/modules目录全是未更改模块,除非运行多站点配置并且自定义模块需要访问所有站点
/sites/default/modules或者/sites/all/modules/custom目录通常存放自定义模块
目录名称为machine-readable name,.info和.module文件也要以machine-readable name为文件名
.info文件提供此模块的human-readable name信息,需要依赖哪些modules,此modules有哪些代码文件等
.info格式:
;$Id$
name = first
description = A first module.
package = Drupal 7 Development
core = 7.x
files[] = first.module
;dependencies[] = autoload
;php = 5.2
1.如果value占用超过一行,应该用引号标记
2.";"开头的行会被视为注释而被Drupal INI忽略
3.第一行是标准,每个.info文件都应该以";$Id$"开头。它是版本控制系统存储此文件的信息的占位符
4.name和description是必须指定的,name定义human-raedable name,description定义此模块的描述
5.package标识这个module与哪些modules有关
6.core
7.files[],每个.info文件必须公布模块里哪些文件包含了PHP的函数、类、接口
.module格式:
1.".module"文件通常包含这个模块的所有主要的钩子实现
2.当Drupal遇到含有hook的事件,Drupal将会遍历、执行所有modules寻找匹配的hook实现
3.以"<?php"开头,可省略"?>"
4.每个module都可以有一个hook_help()实现
5.hook_help()参数$path是帮助系统的URI路径,$arg是访问此URI的参数
6.t('string')负责转换一种语言的字符到其他语言,不能t($var)调用[P41]
7.hook_block_info()告诉Drupal添加新block[声明block]
8.hook_blick_view()告诉Drupal新block请求显示时要做些什么[显示block]
9.每个module只能够实现提供一个hook一次,只能有一个first_block_info()
10.当module需要创建多个block,必须使一个block实现管理多个block的功能
11.hook_block_info()不需要入参,返回array。
12.info提供此block的一句话描述,cache告诉Drupal此block怎样缓存数据
13.hook_block_view(block名字检索),返回此检索的数组数据
14.theme(theme_operation_name, theme_operation_associative_variables_array)
15.module_invoke(module_name, hook_name)调用给一个特定的module下一个特定的钩子
三、主题层
1.presentation logic显示逻辑
2.如果主题提供了自己的实现,Drupal将会替换调module的主题
3.PHPTemplate theme engine
4.实现主题钩子方式:a.Theme functions;b.Templates
5.theme_THEME_HOOK_NAME($variables),入参是想在函数里使用的数据组成的数组
6.MODULE_preprocess_THEME_HOOK_NAME(&$variables),不返回数据
7.template_preprocess_THEME_HOOK_NAME(&$variables)
拥有主题钩子参数的预处理权限,且应该在其他moddule预处理函数前执行
8.MODULE_preprocess(&$variables, $hook),template函数和多个钩子的预加载函数
hook包含正在运行的主题钩子的名字
9.过程函数在预初始化函数之后执行
10.过程函数:template-prefixed process functions, multi-hook process functions,
module-provided process functions, theme-provided process functions
11.过程函数在所有预处理函数运行完毕之后运行
12.Drupal7在template_process_html()函数运行前生成CSS和js文件列表
13.所有预处理函数都比所有过程函数先运行
14.template_prefixed函数首先运行,MODULE_prefixed函数第二位运行,THEME_prefixed函数最后运行
15.Multi-hook函数在hook-specific函数前运行
16.执行一个特定主题的钩子所遵循的执行流程:
template_preprocess()
template_preprocess_HOOK()
MODULE_preprocess()
MODULE_preprocess_HOOK()
THEME_preprocess()
THEME_preprocess_HOOK()
template_process()
template_process_HOOK()
MODULE_process()
MODULE_process_HOOK()
THEME_process()
THEME_process_HOOK()
17.Render element是一个复杂数据结构,通过传递一个单独的参数[arrays]给theme()
18.着色元素数组包含:需要着色的数据,此元素下面的其他着色元素,
在应用此数据时能够用上的主题钩子,应用主题前后将要调用的回调函数列表
19.着色元素内部用drupal_render()输出[$output .= drupal_render($element);]
20.$element格式:
属性以"#"开头,子元素不以"#"开头,值会在发送到具体主题实现前于theme()里替换调"#"
21.Render properties有两个定义的地方:
第一个地方是直接在drupal_render()和它的帮助函数里定义[drupal_render()使用的属性列表P79]
第二个地方是在hook_element_info()里定义
22.每个#type元素都必须在hook_element_info()的实现里定义
23.使用system_element_info()的框架,modules能够通过实现hook_element_info()
去创建各自的复杂着色元素,并且创建任何回调和关联API
24.opportunities延迟
25.hook_page_alter()的两个有用的例子是:
允许插入一个block到页面的主内容,或者在页面范围内翻转、移动"Field"到某个地点
四、模块样式
1.theme_item_list(),期望作为一个item数组参数
2.构建默认主题步骤:
a.注册主题钩子,并定义默认参数
b.构建主题钩子的默认实现
c.重构注册主题
d.构建用于主题钩子的着色元素
3.$classes变量被template_processs()创建,与它相当的$classes_array被template_preprocess()创建
4.如果我们需要添加classes到$classes,添加一个数组元素到$classes_array就可以
五、Admin接口
1.using hook_menu() to mapping Drupal functions to menu items
2.用variable_set()和variable_get()管理Drupal的设置
3.用drupal_mail()和hook_mail()发送邮件
4.如果访问的页面不存在,Drupal将会跳转到上级地址(逐层跳转知道该地址存在)
5.module用hook_permission()定义Permissions
6.查找访问权限信息的唯一途径是通过检查hook_perm()的实现
7.Form API, Field API, File API
8.Form API在Drupal安全性里是一个重要的元素
9.drupal_get_form()需要传递一个form ID,可以是任意值,但是在Drupal必须是唯一的,
典型的命名方式是<module_name>_<description>_form
10.http://www.v2ex.com/rework
11.'#type' => 'value'时传递的value可以是任意数据结构,value元素不包含进返回的HTML代码
12.Persistent variables are saved using variable_set()set(), and retrieved usingvariable_get()
13.system_settings_form()
14.发送邮件流程
a.调用drupal_mail()
b.Drupal根据drupal_mail()头信息创建邮件信息
c.drupal_mail()里调用hook_mail()的实现,添加了邮件内容
d.邮件的所有组成都发送到hook_mail_alter(),允许其他modules修改
e.邮件传送到durpal_send_mail()
f.*通常只需要实现druapl_mail()和hook_mail()
15.Drupal's token system,格式如"[site:name]"也可如"[node:author:e-mail]",token_replace()会自动替换
六、Content
1.相对于创建单独node类型,更有必要创建entities的情况:
a.我们需要entities拥有相对于nodes完全不同的权限控制或者工作流
b.我们需要访问entities且不存储到本地数据库,譬如传统的数据存储
c.我们需要拥有内部变量,像node类型,但是nodes不支持子类型
2.旧版本只有nodes支持sub-types,7以后版本所有entities都支持,Drupal里的sub-types称为bundles
3.bundle是entity里可单独配置的sub-type,Node类型是bundle的一个例子
4.不是所有的entity类型都有bundle,如Users就没有独立的bundle
5.真实的用例中通常允许包含一个Administration系统,以创建、管理bundles
6.用Schema API(Drupal数据层的一部分,不依赖数据库的API)创建数据表
7.hook_schema()是".install"文件最重要的钩子,定义该module提供哪些数据表
8.A "controller" is an object that handles the loading of the entity object for us
9.static cache表示controller需要在内存中保存一份entity副本
10.fieldable表示可以通过Field API给entity和node附加字段,是可定义新entity类型的主要原因之一
11.所有Drupal路径使用连接符代替下划线,但bundle名字必须使用下划线
12.drupal_static()函数,担当PHP静态变量的中心集合
13.当系统某个部分没有独立的$reset参数时,系统强制重置静态缓存
14.当一些代码尝试创建Controller的新实例时,Controller将会懒加载*.inc文件,使class可使用
15.check_plain(),过滤不信任的字符
16.menu_get_item()返回当前菜单条目,system_admin_menu_block(),通过任意菜单条目获取对应子菜单
17.transactions不支持MySQL和MyISAM数据表
七、Field
1.Field API组成
Field type:field名字和数据结构(不是如何保存、如何显示)
Field:field类型的详细配置
Field instance:说明一个特殊的field的组成是一个bundle还是entity类型的子类
Widget:给内容编辑器的一个表格元素
Formatter:格式化field样式的代码段,将覆盖Drupal主题系统
2.尽管不是绝对需要(大多数field将会通过drupal的网络接口配置),还是可给field设置提供一个配置表
3."One" is simply a special case of "many".
4.validate钩子里(扩展至Drupal的大多数情况下),field作为数组的item传送,而不是单独的item
5.widget是简单的Form API片段,扩展Form组件,能够构建成一个大表格,
6.widget的典型用途是构建一个不需要保存field类型本身,只需要保存field值的组件
7.创建的表格元素与dimensions field栏的名字相同
8.explode()函数,根据第一个参数分割字符串,组合成数组;list()将会分割此数组
9.用form_set_value()设置表格元素的值
10.$form_state集合与field的栏目相匹配
11.formatter有两个回调,大多数只用其中一个。
[module]_field_formatter_view()和[module]_table()
[module]_field_formatter_settings_form()和[module]_field_formatter_settings_summary()
12.Apache Solr
13.用一个名字为EntityFieldQuery的类为entities和fileds提供一个查询构造器
three "levels" of data can filter:
a.Entity level data,所有entites的所有类型的数据,包含entity类型,bundle名字,entityID,revisionID
b.Properties,根据提供的一个entity类型查询所有Object的数据元素,但不是所有entity
c.Fields,针对提供的一个bundle定义,可能也会被entity共享不同的类型
14.entityOrderBy(),propertyCondition(),fieldOrderBy()
15.widget能与URL或者第三方数据交互,处理默认值,或者根据某些条件显示表格field的不同点
16.formatter能使用主题系统以显示数据本身或者影响JS库去创建可视化交互式的field数据
八、权限和安全
1.权限处于Drupal安全范围内。
2.user_access(string, account),权限的机器名称,$user对象的副本[user_load()返回]
3.hook_permission()返回此模块的所有必须的权限信息
4.drupal_exit()终止页面继续加载其余部分,不要直接使用PHP的exit(),可能会终止内部函数或者钩子
5.可以用MENU_ACCESS_DENIED代替drupal_exit()
6.页面层的访问检查:
如果把访问检查放到菜单回调,当检查通过,tab链接将只被渲染,通常做法
如果把访问检查放到页面回调,无论是否通过,tab链接都会被渲染,体验不好
drupal_access_denied()返回服务器的403页面,设置面板可指定自定义的403、404页面
8.在模块的install文件里实现hook_enable(),能用代码的方式定义权限,函数内容如:
$permissions = array('view page');
//如果是设置数组,则
$permissions = array(
'view page' => TRUE,
'access content' => FALSE;
);
user_role_change_permissions(DRUPAL_AUTHENTICATED_USER,$permissions);
9.和上条相对应的,也可以实现hook_disable(),用user_role_revoke_permissions()设置拒绝权限
10.user_role_save()和user_role_delete()函数能设置模块的角色[role]
11.user_rolr_load_by_name(),user_role_grant_permissions()
12.当Drupal通过Form API生成表格时,会添加一个用md5哈希生成的form_build_id的token去鉴定
在drupal_build_form()里实现这个id
13.user_access()
$form['menu'] = array(
'#type' => 'fieldset',
'#title' => t('Menu settings'),
'#access' => user_access('administer menu'),//在Form API里,此属性和#disabled不同
'#collapsible' => TRUE,
'#collapsed' => !$link['link_title'],
);
14.传送HTML的隐藏元素,表格属性'#type' => 'value'
15.Using AJAX in other contexts木有细看
九、节点接入
1.Node Access系统提供一个决定授权、权限的API,
2.node的基本操作:CRUD(Create,Read,Update,Delete)
3.(控制node访问安全)Node访问权限记录两个实例:
什么时候的请求对创建个体node起作用(通常由菜单回调和node_access()函数处理)
什么时候的数据库查询返回符合条件的node列表
4.数据库查询中的query:->addTag('node_access')指令调用node_query_node_access_alter()函数,
此函数当查询发送到数据库时,应用'允许node访问规则',
不需要那么多查看、编辑、删除等授权,忽略站点的权限定义
5.node_access(op,node,account)是node操作的主要访问回调,
在node_menu()定义,作为创建查看编辑删除node的访问回调
op表明Node操作被请求,node参数用在创建Node的情况,
在整个页面请求过程中,静态存储每个用户的访问权限
6.[module]_node_access()和[module]_node_grants()
7.无论什么时候,写访问检查时,FALSE都是默认返回值
8.P251的Create、Update、Delete操作Demo
9.node_access表用node id(nid)作为主键,只用来检查已发布的文章的访问权限
10.只实现hook_node_access()的module不在node_access表添加记录,也不添加查询变更逻辑
11.NODE_ACCESS_ALLOW,NODE_ACCESS_DENY,NODE_ACCESS_IGNORE
12.只有Node访问Module才能通过视图操作维护规则,访问控制Module能克制这么做
13.access control module和node access module
14.hook_node_access()只对运行个人Node的访问检查有效
15.hook_node_access()能否决由其他Module定义的行为,可能不太令人满意
16.hook_node_access()推荐给单用例module,尤其是为特殊site或者project的Module
17.Node access module能与其他module协作,提供灵活的访问控制规则
一个Module的Node access rules可能被其他Module修改,hook_node_access()无法实现
Node access module代表通常的使用场景地址,且能被更多people复用
18.access control module和node access module的主要区别是使用node_access表
当node access module已经安装,数据库会把node表添加到node_access表以达到划清返回值的列表的目的
19.node_access表包含一个单独的记录,这允许所有内容都能显示给所有用户
20.当所有node access module激活,这个默认记录会被删除,node查询将会作适当修改
21.P264,node_access表各字段含义(每条记录定义node的规则设定,此表不关心node的发布状态)
22.role_access_node_grants($account, $op)
23.However, if your module relies on data not stored by Drupal core or
contributed modules – both of which should be listed as dependencies[] in your
module.info file – then it is your responsibility to store the data necessary to rebuild
the {node_access} table properly.
24.Domain Access module
25.hook_node_load()
26.hook_node_access_records_alter()和hook_node_grants_alter()
27.Devel Node Access module
十、JavaScript
十一、文件和图像
十二、安装配置文件
附录A、数据库访问
附录B、安全
------------------------Drupal 7 Module---end-------------------------
------------------------Development plus---start------------------------
Entity
Drupal的抽象数据类型,必须实现core Entity API里定义的Entity接口
这是node,comment,user,早前版本的术语类型分类,的统称
在Drupal7里,只有来自CRUD的R是core里指定的,但是在下一个版本正在进行工作以填补空缺。
Entity能有多个bundle
Bundle
Bundle是field的组合。一个bundle是一个entity的实现,特例。
如果node是一个entity,那么一个article就是一个bundle。
这允许系统区别kind和type,kind
Field
Field是具备同样名字的已经迁移到Drupal core的CCK数据类型的体现(典型)。
一个field是一个私有的drupal数据类型,实现了这些网页界面的描述。
Field拥有一个关联的schema(架构、描述),格式化widget和setting。
例子有:file field,text field,。
module能定义新的field类型。
Field Instance
一个Field实现是一个具体的专业化的field类型。
它把field类型捕捉到一齐,和他们的配置一起:schema,formatter,widget。
field实现附属于bundle
Fieldable object
这个术语有时用于entity和bundle
hook_block_info()告诉Drupal添加新block[声明block],不需要入参,返回array。
hook_blick_view()告诉Drupal新block请求显示时要做些什么[显示block]
hook_block_view(block名字检索),返回此检索的数组数据
module_invoke(module_name, hook_name)调用给一个特定的module下一个特定的钩子
hook_perm()查找访问权限信息的唯一途径
drupal_get_form(form_ID)ID可以是任意值,但是在Drupal必须是唯一的,典型命名:<module_name>_<description>_form
system_settings_form()
$form_state集合与field的栏目相匹配
page callback,当请求的地址请求完毕后调用,当没有匹配的地址时会把地址传进去
access callback和access arguments定义用户是否有权限进入请求的菜单
引导指令(bootstrap)
db_query("SELECT * FROM {mymodule_abc} WHERE abc_id = :abc_id", array(':abc_id' => $abc_id))->fetchObject();
http://api.drupal.org/api/drupal/modules%21field%21field.attach.inc/function/field_attach_prepare_view/7
http://api.drupal.org/api/drupal/includes%21common.inc/function/entity_prepare_view/7
http://v.youku.com/v_show/id_XMzM1NDc1ODc2.html
------------------------Development plus---end------------------------
------------------------Development note---start------------------------
hook_help($path, $arg)
当请求的地址相匹配时,在响应页面的首行位置添加返回的字符串
fetchField()
从数据库中获取单个字段值
user_load()加载用户对象
$owner = user_load(array('uid'=>$node->uid));//在节点内
$owner = user_load(array('uid'=>$comment->uid));//在评论中
$owner = user_load(array('uid'=>$user->uid));//在用户资料中
------------------------Development note---end------------------------
------------------------Pro Drupal 7 Development---start------------------------
一、数据库层
位于sites/example.com/settings.php或者sites/default/settings.php
定义数据库连接的代码行如下所示(以MySQL为例):
$db_url = 'mysql://username:password@localhost/databasename';
通过检查settings.php内部的变量$db_url,Drupal决定要连接的数据库的类型。
#如果$db_url开始部分为“mysql”,那么Drupal将包含进includes/database.mysql.inc
1.db_query()用来为已建立的数据库连接执行查询语句。这些查询语句包括SELECT, INSERT, UPDATE, 和 DELETE。
db_query('SELECT * FROM {joke} WHERE vid = %d', $node->vid);
db_query("INSERT INTO {joke} (nid, vid, punchline) VALUES (%d, '%s')", $node->nid, $node->punchline);
db_query("UPDATE {joke} SET punchline = '%s' WHERE vid = %d", $node->punchline, $node->vid);
db_query('DELETE FROM {joke} WHERE nid = %d', $node->nid);
#注意到表名位于花括号之间,这样做是为了表名可以前缀化,这样可以保证它们名称的唯一性。
#下一个注意的地方是%d占位符,在Drupal中,查询语句通常使用占位符,真实值作为参数跟在后面。
2.根据数据的类型,这里有不同的%修饰符。占位符和对应的含义如下:
%s String
%d Integer
%f Float
%b Binary data; do not enclose in ' '
%% Inserts a literal % sign (e.g., SELECT * FROM {users} WHERE name LIKE '%%%s%%')
3.返回已发布博客日志的总数:
$sql = "SELECT COUNT(*) FROM {node} WHERE type = 'blog' AND status = 1";
$total = db_result(db_query($sql));
4.迭代方式用于遍历整个结果集(输出所有的已发布的类型为blog的节点):
$sql = "SELECT * FROM {node} WHERE type = 'blog' AND status = 1";
$result = db_query(db_rewrite_sql($sql));
while ($data = db_fetch_object($result)) {
$node = node_load($data->nid);
print node_view($node, TRUE);
}
#db_fetch_object()从结果集中取出一行作为一个对象
#db_fetch_array()将取出的结果作为一个数组
4.10个最新发布的日志
$sql = "SELECT * FROM {node} n WHERE type = 'blog' AND status = 1 ORDER BY n.created DESC";
$result = db_query_range(db_rewrite_sql($sql), 0, 10);
#并非所有的数据库都支持LIMIT语句,所以需要使用db_query_range()作为包裹函数
5.将结果分页显示
$sql = "SELECT * FROM {node} n WHERE type = 'blog' AND status = 1 ORDER BY n.created DESC";
$result = pager_query(db_rewrite_sql($sql), 0, 10);
while ($data = db_fetch_object($result)) {
$node = node_load($data->nid);
print node_view($node, TRUE);
}
//展示导航到其他页面的链接,不用向theme('pager')传递结果总数,因为结果总数在调用pager_query()时已记下
print theme('pager', NULL, 10);
6.使用临时表(略)
二、API
1.hook_menu()的type类型
MENU_NORMAL_ITEM:这是菜单条目使用的默认类型,它们会显示在菜单树中。
MENU_ITEM_GROUPING:这种类型对条目进行分组,简单地列出要访问的子页面。
MENU_CALLBACK:注册一个回调函数,它会生成在访问 URL 时要显示的内容。
MENU_SUGGESTED_ITEM:管理员可以启用来自模块的建议条目。
MENU_LOCAL_TASK:这些页面显示为选项卡。其他显示方式也是可能的。
MENU_DEFAULT_LOCAL_TASK:每组本地任务还应该提供一个默认任务,它链接到与它的父条目相同的路径。
"title": 必须
"title callback": 生成title的函数,默认用t()。如果只需要生成输出字符串,设为FALSE
"title arguments": 发送到t()或者自定义函数的参数
"description":
"page callback": 访问此页面时调用此函数以生成页面。如果没有设置,会用其父菜单项的回调代替
"page arguments":
"access callback": 访问权限回调函数,有权限时返回TRUE。只有MENU_DEFAULT_LOCAL_TASK能继承access callbacks。用user_access函数检查的话,参数必须是'access arguments'
"access arguments":
"file": 调用page callback前被包含进来
"file path":
"load arguments": 发送到地址里的每一个通配符对象加载器的参数数组,在地址参数后面。如果一个模块注册地址node/%node/revisions/%/view
"weight":
"menu_name": Optional. 如果不希望此item出现在导航里,设置为自定义菜单
"tab_parent": For local task menu items, the path of the task's parent item; defaults to the same path without the last component.
"tab_root": For local task menu items, the path of the closest non-tab item; same default as "tab_parent".
"position": Position of the block ('left' or 'right') on the system administration page for this item.
"type": A bitmask of flags describing properties of the menu item. Many shortcut bitmasks are provided as constants in menu.inc:
MENU_NORMAL_ITEM:默认值,Normal menu items show up in the menu tree and can be moved/hidden by the administrator.
MENU_CALLBACK: Callbacks simply register a path so that the correct information is generated when the path is accessed.
MENU_SUGGESTED_ITEM: Modules may "suggest" menu items that the administrator may enable.
MENU_LOCAL_TASK: Local tasks are menu items that describe different displays of data, and are generally rendered as tabs.
MENU_DEFAULT_LOCAL_TASK: Every set of local tasks should provide one "default" task, which should display the same page as the parent item.
2.单项选择框
$form['table_name']['item_name'] = array(
'#type' => 'radios',
'#title' => t('show_name'),
'#default_value' => $value,
'#options' => array(t('Blocked'), t('Active')),
);
3.
http://www.soberma.com/notepad-quicktext
------------------------Pro Drupal 7 Development---end------------------------
------------------------PHP---start------------------------
------------------------PHP----end-------------------------