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 相关文章推荐
mysql时区问题
Mar 26 PHP
php读取数据库信息的几种方法
May 24 PHP
ecshop 订单确认中显示省市地址信息的方法
Mar 15 PHP
PHP获取当前页面URL函数实例
Oct 22 PHP
php通过Chianz.com获取IP地址与地区的方法
Jan 14 PHP
PHP网站建设的流程与步骤分享
Sep 25 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
Apr 23 PHP
SAE实时日志接口SDK用法示例
Oct 09 PHP
ecshop适应在PHP7的修改方法解决报错的实现
Nov 01 PHP
thinkPHP5框架设置404、403等http状态页面的方法
Jun 05 PHP
phpMyAdmin通过密码漏洞留后门文件
Nov 20 PHP
在Laravel5中正确设置文件权限的方法
May 22 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
Optimizer与Debugger兼容性问题的解决方法
2008/12/01 PHP
注册页面之前先验证用户名是否存在的php代码
2012/07/14 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
2014/02/18 PHP
php简单实现批量上传图片的方法
2016/05/09 PHP
PHP jQuery+Ajax结合写批量删除功能
2017/05/19 PHP
JS鼠标事件大全 推荐收藏
2011/11/01 Javascript
javascript实现文字图片上下滚动的具体实例
2013/06/28 Javascript
JavaScript异步编程:异步数据收集的具体方法
2013/08/19 Javascript
JS清空多文本框、文本域示例代码
2014/02/24 Javascript
解决checkbox的attr(checked)一直为undefined问题
2014/06/16 Javascript
原生javascript实现解析XML文档与字符串
2016/03/01 Javascript
BootStrap制作导航条实例代码
2016/05/06 Javascript
JavaScript暂停和继续定时器的实现方法
2016/07/18 Javascript
RGB和YUV 多媒体编程基础详细介绍
2016/11/04 Javascript
jquery获取input type=text中的值的各种方式(总结)
2016/12/02 Javascript
servlet+jquery实现文件上传进度条示例代码
2017/01/25 Javascript
JS实现二叉查找树的建立以及一些遍历方法实现
2017/04/17 Javascript
bootstrap multiselect 多选功能实现方法
2017/06/05 Javascript
JavaScript比较同一天的时间大小实例代码
2018/02/09 Javascript
[06:33]DOTA2亚洲邀请赛小组赛第二日 TOP10精彩集锦
2015/01/31 DOTA
Android基于TCP和URL协议的网络编程示例【附demo源码下载】
2018/01/23 Python
python使用scrapy发送post请求的坑
2018/09/04 Python
django 模版关闭转义方式
2020/05/14 Python
Django在Model保存前记录日志实例
2020/05/14 Python
python实现双人五子棋(终端版)
2020/12/30 Python
HTML5实现音频和视频嵌入的方法
2018/08/22 HTML / CSS
日本动漫周边服饰销售网站:Atsuko
2019/12/16 全球购物
建筑工程管理专业自荐信范文
2013/12/28 职场文书
自我鉴定四大框架
2014/01/17 职场文书
小学科学教学反思
2014/01/26 职场文书
电力工程合作意向书
2015/05/11 职场文书
在校学生证明格式
2015/06/24 职场文书
医学生自荐信范文(2016精选篇)
2016/01/28 职场文书
《家世》读后感:看家训的力量
2019/12/30 职场文书
Python获取字典中某个key的value
2022/04/13 Python
mysql性能优化以及配置连接参数设置
2022/05/06 MySQL