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 自写函数代码 获取关键字 去超链接
Feb 08 PHP
PHP中对用户身份认证实现两种方法
Jun 04 PHP
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
Jun 19 PHP
php相对当前文件include其它文件的方法
Mar 13 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
Apr 25 PHP
CodeIgniter集成smarty的方法详解
May 26 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
Feb 14 PHP
php的优点总结 php有哪些优点
Jul 19 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
Oct 22 PHP
Laravel框架Eloquent ORM修改数据操作示例
Dec 03 PHP
laravel 框架执行流程与原理简单分析
Feb 01 PHP
PhpStorm+xdebug+postman调试技巧分享
Sep 15 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空间不支持socket但支持curl时recaptcha的用法
2011/11/07 PHP
php去掉URL网址中带有PHPSESSID的配置方法
2014/07/08 PHP
php版微信公众平台接口参数调试实现判断用户行为的方法
2016/09/23 PHP
Gambit vs ForZe BO3 第三场 2.13
2021/03/10 DOTA
发布一个基于javascript的动画类 Fx.js
2010/11/05 Javascript
JS中Iframe之间传值及子页面与父页面应用
2013/03/11 Javascript
A标签中通过href和onclick传递的this对象实现思路
2013/04/19 Javascript
Javascript封装DOMContentLoaded事件实例
2014/06/12 Javascript
javascript中声明函数的方法及调用函数的返回值
2014/07/22 Javascript
jQuery遍历DOM节点操作之filter()方法详解
2016/04/14 Javascript
详解AngularJS通过ocLazyLoad实现动态(懒)加载模块和依赖
2017/03/01 Javascript
详解node如何让一个端口同时支持https与http
2017/07/04 Javascript
vue中element组件样式修改无效的解决方法
2018/02/03 Javascript
elementUI table表格动态合并的示例代码
2019/05/15 Javascript
vue excel上传预览和table内容下载到excel文件中
2019/12/10 Javascript
ES5新增数组的实现方法
2020/05/12 Javascript
vue2和vue3的v-if与v-for优先级对比学习
2020/10/10 Javascript
Python快速从注释生成文档的方法
2016/12/26 Python
pycharm 在windows上编辑代码用linux执行配置的方法
2018/10/27 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
2019/11/19 Python
使用keras2.0 将Merge层改为函数式
2020/05/23 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
2020/06/06 Python
Python进行统计建模
2020/08/10 Python
墨尔本复古时尚品牌:Dangerfield
2018/12/12 全球购物
文职个人求职信范文
2013/09/23 职场文书
建筑工程管理专业自荐信范文
2013/12/28 职场文书
青春演讲稿范文
2014/05/08 职场文书
建筑工地大门标语
2014/06/18 职场文书
大客户经理岗位职责
2015/04/09 职场文书
企业承诺书格式范文
2015/04/28 职场文书
亮剑观后感300字
2015/06/05 职场文书
干部培训简讯
2015/07/20 职场文书
大学生入党自我鉴定范文
2019/06/21 职场文书
OpenCV 图像梯度的实现方法
2021/07/25 Python
小喇叭开始广播了! 四十多年前珍贵老照片
2022/05/09 无线电
SQL Server2019安装的详细步骤实战记录(亲测可用)
2022/06/10 SQL Server