Drupal7 form表单二次开发要点与实例


Posted in PHP onMarch 02, 2014

请记得收藏此文,在你进行Drupal 7 custom module时,经常会用到的form 表单的跳转或重载。

主要汇总三个要点:

1.页面提交后,经过#submit处理后,需要redirect 跳转到另外一个页面。
2.url路径中存在destination参数时,页面直接跳转到destination所指的url,无法控制的问题。
3.form表单如何实现multiple steps forms 多个步骤,或者表单提交后,如何在表单获取到提交上来的值。

一、Form 表单 redirect(跳转)到另外一个页面

$form_state['redirect'] 的值可以是字符串或者数组,值通过url后,生成跳转地址。

$form_state['redirect'] = array(
  'node/123',
  array(
    'query' => array(
      'foo' => 'bar',
    ),
    'fragment' => 'baz',
}
//页面将会跳转到 node/123?foo=bar#baz
$form_state['redirect'] = 'node/123'
//页面将会跳转到 node/123

如果不指定$form_state['redirect'] 的值,默认跳转到当前页面。drupal_goto(current_path(), array(‘query' => drupal_get_query_parameters())); API中是这样执行的。

二、Form 表单 destination(目的地)被指定时也可以改变跳转的地址

在drupal_goto 函数中,你可以看到如果url路径中存在destination参数,页面直接就到destination所指向的链接,导致某些表单下的多个按钮提交后,本应redirect 跳转的页面也不尽不同。

于是在form的#submit 函数中,某些操作时可以直接删除掉destination。

if (isset($_GET['destination'])) {
  $form_state['redirect'] = array('next_step_page_url', array('query' => drupal_get_destination()));
  unset($_GET['destination']);
}

我采取的方法是,重新定义一个url并继续传递destination,但是将$_GET中的destination删除掉。但是一般还是会经常用到destination这个目的地的跳转。

三、Form 表单 实现multiple steps多个步骤,Form表单重载,获取Form提交的值

这些问题其实归根到底都是一个意思,就是让表单继续提交下去。而不是刷新页面。只需在form 表单的 #submit 函数中 执行以下代码:

if ($form_state['values']['op'] == t("Next Step")) {
  $form_state['rebuild'] = TRUE;
  $form_state['storage']['users'] = $form_state['values']['users'];
}

在form的define定义中即可获取到$form_state['storage']['users']这个值。

参考Drupal7 相关API函数:

drupal_redirect_form
drupal_goto
drupal_get_destination

PHP 相关文章推荐
php设计模式 Facade(外观模式)
Jun 26 PHP
php preg_filter执行一个正则表达式搜索和替换
Feb 27 PHP
浅析关于PHP位运算的简单权限设计
Jun 30 PHP
PHP imagegrabscreen和imagegrabwindow(截取网站缩略图)的实例代码
Nov 07 PHP
thinkphp学习笔记之多表查询
Jul 28 PHP
Fedora下安装php Redis扩展笔记
Sep 03 PHP
PHP中实现获取IP和地理位置类分享
Feb 10 PHP
基于PHP实现的事件机制实例分析
Jun 18 PHP
PHP打印输出函数汇总
Aug 28 PHP
PHP多维数组元素操作类的方法
Nov 14 PHP
php支付宝系列之电脑网站支付
May 30 PHP
PHP安装BCMath扩展的方法
Feb 13 PHP
Drupal7中常用的数据库操作实例
Mar 02 #PHP
php设计模式之命令模式使用示例
Mar 02 #PHP
php接口和抽象类使用示例详解
Mar 02 #PHP
php通过字符串调用函数示例
Mar 02 #PHP
php多维数组去掉重复值示例分享
Mar 02 #PHP
PHP 函数call_user_func和call_user_func_array用法详解
Mar 02 #PHP
PHP 字符串长度判断效率更高的方法
Mar 02 #PHP
You might like
PHP删除HTMl标签的实现代码
2013/06/30 PHP
Joomla开启SEF的方法
2016/05/04 PHP
php版微信自定义回复功能示例
2016/12/05 PHP
php + WebUploader实现图片批量上传功能
2019/05/06 PHP
控制打印时页眉角的代码
2007/02/08 Javascript
jQuery 全选效果实现代码
2009/03/23 Javascript
javascript 有用的脚本函数
2009/05/07 Javascript
js下写一个事件队列操作函数
2010/07/19 Javascript
jQuery 源码分析笔记(7) Queue
2011/06/19 Javascript
js获取单选框或复选框值及操作
2012/12/18 Javascript
jquery实现弹出层完美居中效果
2014/03/03 Javascript
jQuery控制Div拖拽效果完整实例分析
2015/04/15 Javascript
详细介绍jQuery.outerWidth() 函数具体用法
2015/07/20 Javascript
实例解析jQuery插件EasyUI最常用的表单验证规则
2015/11/29 Javascript
self.attachevent is not a function的解决方法
2017/04/04 Javascript
jQuery Validate 校验多个相同name的方法
2017/05/18 jQuery
vue iView 上传组件之手动上传功能
2018/03/16 Javascript
基于游标的分页接口实现代码示例
2018/11/12 Javascript
Vue插槽原理与用法详解
2019/03/05 Javascript
如何基于javascript实现贪吃蛇游戏
2020/02/09 Javascript
ES5 模拟 ES6 的 Symbol 实现私有成员功能示例
2020/05/06 Javascript
Vue-CLI 3 scp2自动部署项目至服务器的方法
2020/07/24 Javascript
[10:28]2018DOTA2国际邀请赛寻真——VGJ.S寻梦之路
2018/08/15 DOTA
使用Python脚本来控制Windows Azure的简单教程
2015/04/16 Python
python&MongoDB爬取图书馆借阅记录
2016/02/05 Python
Python中字符串的格式化方法小结
2016/05/03 Python
Python学习小技巧之列表项的拼接
2017/05/20 Python
Python操作Oracle数据库的简单方法和封装类实例
2018/05/07 Python
python函数定义和调用过程详解
2020/02/09 Python
python自动化测试三部曲之request+django实现接口测试
2020/10/07 Python
【HTML5】3D模型--百行代码实现旋转立体魔方实例
2016/12/16 HTML / CSS
导出HTML5 Canvas图片并上传服务器功能
2019/08/16 HTML / CSS
美体小铺加拿大官方网站:The Body Shop加拿大
2016/10/30 全球购物
分解成质因数(如435234=251*17*17*3*2,据说是华为笔试题)
2014/07/16 面试题
应届生英语教师求职信
2013/11/05 职场文书
Python中json.dumps()函数的使用解析
2021/05/17 Python