Drupal专业开发指南(10-12章).doc

  1. 1、本文档共58页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Drupal专业开发指南(10-12章)

第10章 Drupal 表单 API(form API) - 表单处理流程 表单 API Drupal4.7 及更高版本提供了一个应用程序接口(API)用来生成、验证和处理 HTML 表单。表单 API 将表单抽象为一个关于属性和值的嵌套数组。在生成页面时,表单呈现引擎会在适当的时候将数组呈现出来。这种方式包含多层含义: 没有直接输出 HTML,我们而是创建了一个数组并让引擎生成 HTML 由于我们将表单的表示处理为结构化的数据,所以我们就可以对表单进行添加、删除、重新排序、和修改等操作。当你想用一种干净平和的方式对由其它模块创建的表单进行修改时,这会特别方便。 任意一个表单元素可以映射到任意一个主题函数上 可以对任意表单添加额外的表单验证或处理函数 对表单操作进行了保护,从而防止表单注入攻击,特别是用户修改了表单并接着试图提交它时。 使用表单的学习曲线有点高 在本章,我们将迎难而上。我们将学习如何创建、验证、处理表单,以及当我们想要一个个性化的外观时如何编写主题函数:本章所讲的都是关于 Drupal5 版本所实现的表单 API。 理解表单处理流程 图10-1 展示了表单的构建、验证、和提交的流程 图10-1 Drupal 是如何处理表单的 为了更好的与表单 API 进行交互,理解 API 背后的引擎是如何工作的将会非常有用。在接下来的部分解释了调用 drupal_get_form() 时都发生了什么。 流程初始化 调用 drupal_get_form() 后,首先初始化,$form_values(用来保存提交数据的数组)置为空数组,$form_submitted 设为 FALSE。 设置一个令牌(token) 表单系统的一个优点是,它尽力去保证被提交的表单是由 Drupal 真正创建的。这主要是为了安全性和防止垃圾信息的提交。为了达到这一点,Drupal 为每一个 Drupal 安装都设置了一个私钥,Drupal 将基于私钥生成一个随机的令牌作为隐藏于发送到表单中。当表单提交时,会对令牌进行测试。相关背景信息请参看 /node/28420。令牌只在登录用户中适用,因为匿名用户的页面通常会被缓存起来,这样它们就没有一个唯一的令牌了。 设置一个ID 一个包含了当前表单 ID 的隐藏域作为表单的一部份被发送给浏览器。该 ID 一般对应于定义表单的函数,它也是方法 drupal_get_form() 的第一个参数。例如函数 user_register() 定义了用户注册表单,它的调用方式如下: $output = drupal_get_form(user_register); 收集所有可能的表单元素定义 接着,调用 element_info()。它将触发所有实现了钩子函数 hook_elements() 的模块上的钩子函数。在 Drupal 核心内部,标准表单元素,比如单选按钮和复选框,都定义在 system.module 中的钩子函数 hook_elements() 中。当模块需要定义他们自己的元素类型时,就需要实现这个钩子。在以下几种情况中,你可能需要在你的模块中实现 hook_elements():你想要一个特定的表单元素类型时,比如一个可在预览节点时展示图像缩略图的图像上传按钮;或者,你想通过定义更多的属性 来扩展已有的表单元素时。 例如,模块 views 定义了它自己的元素类型: /* * Custom form element to do our nice images. */ function views_elements() { $type[imagebutton] = array( #input = TRUE, #button_type = submit, ); return $type; } 模块 TinyMCE 通过禁用 textarea 的自适应大小能力修改了一个默认的已存在的表单元素类型(它还添加了一个属性 #process,这样当构建表单时,它将调用 process_textarea() 从而修改该表单元素)。 /** * Implementation of hook_elements(). */ function tinymce_elements() { $type = array(); if (user_access(access tinymce)) { // Set resizable to false to prevent drupal.js resizable function from // taking control of the textarea. $type[textarea] = array( #process = array(tinymce_process_textarea =

文档评论(0)

qwd513620855 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档