当前位置:首页 > CMS教程 > 其它CMS > 列表

Drupal 7自定义表单开发要点与例子

发布:smiling 来源: PHP粉丝网  添加日期:2014-12-05 13:57:12 浏览: 评论:0 

在你进行Drupal 7 custom module时,经常会用到的form 表单的跳转或重载,碰到这个问题我下面来给大家分析原因与分享解决办法.

主要汇总三个要点:

页面提交后,经过#submit处理后,需要redirect 跳转到另外一个页面,url路径中存在destination参数时,页面直接跳转到destination所指的url,无法控制的问题.

form表单如何实现multiple steps forms 多个步骤,或者表单提交后,如何在表单获取到提交上来的值.

Form 表单 redirect(跳转)到另外一个页面,$form_state['redirect'] 的值可以是字符串或者数组,值通过url后,生成跳转地址,代码如下:

  1. $form_state['redirect'] = array
  2.   'node/123'
  3.   array
  4.     'query' => array
  5.       'foo' => 'bar'
  6.     ), 
  7.     'fragment' => 'baz www.phpfensi.com'

页面将会跳转到 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,代码如下:

  1. if (isset($_GET['destination'])) { 
  2.   $form_state['redirect'] = array('next_step_page_url'array('query' => drupal_get_destination())); 
  3.   unset($_GET['destination']); 

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

Form 表单 实现multiple steps多个步骤,Form表单重载,获取Form提交的值,这些问题其实归根到底都是一个意思,就是让表单继续提交下去,而不是刷新页面.

只需在form 表单的 #submit 函数中执行以下代码:

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

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

看一个例子,代码如下:

  1. <?php 
  2. /** 
  3.  * Implements hook_element_info(). 
  4.  */ 
  5. function example_element_info() { 
  6.   $types = array
  7.     'example' => array
  8.       '#input' => TRUE, 
  9.       '#tree' => TRUE, 
  10.       '#process' => array('example_process'), 
  11.       '#theme' => array('example'), 
  12.       '#pre_render' => array('form_pre_render_conditional_form_element'), 
  13.       '#value_callback' => 'example_value_callback' 
  14.     ) 
  15.   );//www.111Cn.Net 
  16.    
  17.   return $types
  18.  
  19. /** 
  20.  * element显示前对element内参数的处理 
  21.  */ 
  22. function example_process($element$form_state) { 
  23.     if(isset($element['default_value'])) { 
  24.         $element['#default_value'] = $element['default_value']; 
  25.     } 
  26.   return $element
  27.  
  28. /** 
  29.  * element呈现的模板 
  30.  */ 
  31. function theme_example($variables) { 
  32.   $output = '<input name="example" type="text" value=""/>'
  33.   return $output
  34.  
  35. /** 
  36.  * from submit后,element的最终值 
  37.  */ 
  38. function example_value_callback($element$input = FALSE, &$form_state) { 
  39.   if ($input !== FALSE) { 
  40.     // element可以由多个element组成,但只有一个返回值,其他element将不返回 
  41.     return $_POST['example']; 
  42.   } elseif (!emptyempty($element['#default_value'])) { 
  43.     return $element['#default_value']; 
  44.   } 
  45.    
  46.   return
  47.  
  48. /** 
  49.  * Implements hook_theme(). 
  50.  */ 
  51. function example_theme() { 
  52.   return array
  53.       'example' => array
  54.         'render element' => 'element'
  55.       ) 
  56.   ); 
  57.  
  58. function example_menu() 
  59.   $items = array(); 
  60.   $items['test_element'] = array
  61.     'title' => 'Example'
  62.     'page callback' => 'drupal_get_form'
  63.     'page arguments' => array('example_form'), 
  64.     'access callback' => TRUE, 
  65.     'expanded' => TRUE, 
  66.   ); 
  67.   return $items
  68.  
  69. function example_form($form, &$form_state) { 
  70.     $form = array(); 
  71.     $form['example'] = array
  72.       '#type' => 'example'
  73.       '#title' => 'example'
  74.     );//开源软件:phpfensi.com 
  75.     $form['submit'] = array
  76.       '#type' => 'submit'
  77.       '#value' => 'Submit' 
  78.     ); 
  79.     return $form
  80.  
  81. function example_form_submit($form, &$form_state) { 
  82.     drupal_set_message('value: '.$form_state['values']['example']); 
  83. ?>

Tags: Drupal7 Drupal7自定义表单

分享到: