drupal究竟是什么?我想就不用多说了,不知道的可以去官网上c一下。
虽然本人现在对于drupal的内部结构或者什么的还是不太清楚,但是经过近半个月的时间的摸索,也算有了点儿眉目。以这篇文章记录一下。
为了阅读drupal代码比较方便,可以更改eclipse对install和module等文件的支持。
设置方法如下:
1. Windows – Preferences – General – Editors- File Associations, 关联 *.module and *.install 到 PHP Editor.
2. 在 Windows – Preferences – General – Content Types, 添加 *.module and *.install 到 Text -> PHP Content Type
在进入正题之前需要搞明白钩子究竟是个什么东西?因为钩子在drupal当中的应用可以说是相当广泛的。
钩子的原理与定义:
为了阅读drupal代码比较方便,可以更改eclipse对install和module等文件的支持。
设置方法如下:
1. Windows – Preferences – General – Editors- File Associations, 关联 *.module and *.install 到 PHP Editor.
2. 在 Windows – Preferences – General – Content Types, 添加 *.module and *.install 到 Text -> PHP Content Type
钩子的原理与定义:
有如下程序流:
在B处有以挂钩点
main(){funA();B//----->挂钩点funB();}
加入钩子挂钩点B的函数funB
则程序流变成如下的结构:
main(){funA();funB();funC();}
有时候容易把drupal的登录框丢掉,写出来以下。登录地址: yoursite.com/?q=user/login
drupal总体感觉最令人叹服的有以下几点:
1.词汇附加term,表示出了平时初级cms难以解决的无限级分类问题。
2.Views模块的应用,他可以经过一定的筛选将特定规则的资源呈现在用户面前。
3.另外还有灵活的资源机制(资源也可以称为内容)。可以动态的添加字段,用来记录内容的表现形式。类似微软的BASIC,拖几个控件一个应用程序就出来了。同理drupal令人叹服的也是这一点吧!修改几个字段,修改一个表现形式,然后就可以添加出来了。
注:也许本人水平目前有限,只能看到这些吧。
drupal的文件夹布局:
includes 常用函数库 misc 常用脚本和图标 moduldes 核心模块 profiles 安装轮廓
scripts shell,peal脚本 sites 开发者对drupal做的修改,包括模块主题等 sites/all/modules放下载的或者自己编写的扩展模块 sites/default 站点的默认配置文件 sites/default/settings.php默认配置文件 sites/default/files对外访问上传文件用的 themes 主题引擎和设置下载的主题需要放到sites/all/themes
访问过程首先经过.htaccess过滤,将多余的url重写到index.php?q=fadsf/afdasf
drupal的访问过程
1. 浏览器输入 www.example.com/node/123
2. 浏览器将信息传递到www.example.com url数据 node/123
3. web sever重组url,然后建立一个php环境来处理请求
4. 执行index.php 传到node/123
5. drupal核心类库经历初始化,和加载资源(所有的模块),判断出如何处理node/123
6. 请求模块处理
7. 主题模块,将数据包装成为html和css以及javascript
8. 浏览器接收html并将结果呈现给最终用户
Drupal的请求被分成了两部分,一部分加载所有的模块,另一部分,执行相应的菜单请求,并将结果返回给浏览器
心得:只要在任何地方用global声明的变量,都是全局变量,不管是不是在函数内部
模块方法的命名用模块名加钩子名,用下划线隔开,组成覆盖的函数的名字,
例如tianmen_init() 表示在tianmen模块中覆盖了核心init函数
模块的实质就是一堆钩子函数覆盖的堆砌,除此以外也就没有什么了……
hook_init() hook_exit() 两个方法组成了模块的声明周期
Drupal中的Node只是一个结构化文档,一个显示结构,Drupal中的Node概括了网站的内容,里边包含了钩子的定义,其他模块调用的钩子。
自定义模块的位置推荐在/sites/default/modules/
自定义模块的编写方法和测试方法,启用方法,和测试方法。
注:info文件的头部一定要有分号,否则Drupal不知道如何解析,将报错
从头到尾建立一个模块:
1.建立模块文件夹 testform
2.建立info文件 testform.info 内容大致如下
;$Id$
name = Test form
description = this is only test for form api
package = Tianmen module test
version = VERSION
core = 7.x
files[] = testform.module
3.实现一个钩子
钩子的命名方法,一般钩子函数定义为hook_function(其中function为钩子的名字),将hook改为模块的名字。
例如hook_theme在本模块中将变成testform_theme;
实现一个简单的钩子吧!
function testform_help($path,$args){
switch($path){
case 'admin/help#testform':
return "this is only for the test form api";
}
}
4.测试这样将在modules中出现一个新的module,名字为testform 启用以后在后面将多出一个help菜单,点击help菜单将看到help的内容
5.建立一个block显示内容
实现hook_block_info和hook_block_view
如下代码:
function testform_block_info(){
$blocks = array();
$blocks['list_modules'] = array(
'info' => t('A listing of all of the enabled modules.'),
'cache' => DRUPAL_NO_CACHE,
);
return $blocks;
}
function testform_block_view($block_name) {
if($block_name == 'list_modules') {
$theme_args = array('items' => $list, 'type' => 'ol');
$content = theme('item_list', $theme_args);
$block=array(
'subject' => 'Enable Modules',
'content' => $content,
);
return $block;
}
}
这样就可以在block面板中发现自己建立的block,如果看不到,那么清清除cache。
注:内容可以使得登录以后才可以看到,当user_is_logged_in函数返回true时表示用户已经登录。
对应区域中的内容,可以调用render函数将内容还原成为html代码。参数是$page['region_name'],这也是模块与主题交互的一种手段。
自定义的block一定要在主div内部,即
一个region可以显示若干个block
6. 实现自定义模块菜单,用返回内容的形式,或者处理表单的内容
function testform_menu() {
$items['testform'] = array(
'title' => 'View the sample form',
'page callback' => 'menucallback',
'page arguments' => array('testform_page'),
'access callback' => TRUE,
'type' => MENU_NORMAL_ITEM
);
return $items;
}
|