鉴于$表格,如何编程方式生成相应的$ form_state? -- forms 领域 drupal 相关 的问题

Given $form, how to programmatically generate its corresponding $form_state?


2
vote

问题

中文

media_mover模块包含此函数,它构建表单并预先填充默认值:

  /* step 1 */ $form = media_mover_api_configuration_base_form($configuration);    

它还包含此功能,提交表单:

  /* step 2 */ function media_mover_api_add_config_form_submit($form, &$form_state)   

我想以编程方式生成表单(步骤1),然后编程方式提交表单(步骤2)。
第1步不是问题;我能够生成 $form 。对于第2步,我需要 $form_state

给定 $form ,有没有办法以编程方式生成其对应的 $form_state ?我正在使用drupal 6。

这是对我想要完成的事情的更详细的解释。 我能够通过同步填写并通过牺牲地设置一个特定形式,在 99887666 中的所有字段值设置,然后调用 media_mover_api_add_config_form_submit($form, &$form_state);

但是,如果我可以使用此函数将 99887668 对象转换为 $form ,则该过程将更加简单。 $form ,并完成所有繁重的升降机:
  /* step 2 */ function media_mover_api_add_config_form_submit($form, &$form_state) 0  

此函数将默认值输入每个表单字段。 那么,唯一丢失的步骤是将所有这些默认字段值复制到 998876611 /* step 2 */ function media_mover_api_add_config_form_submit($form, &$form_state) 2 。我想知道是否有一个功能要做这件事。或者有没有办法通过 /* step 2 */ function media_mover_api_add_config_form_submit($form, &$form_state) 3 中的所有字段循环,并提取字段名称和默认值?

英文原文

The media_mover module contains this function, which builds a form and pre-populates default values:

/* step 1 */ $form = media_mover_api_configuration_base_form($configuration);  

It also contains this function, which submits the form:

/* step 2 */ function media_mover_api_add_config_form_submit($form, &$form_state) 

I would like to programmatically generate the form (step 1), and then programmatically submit the form (step 2).
Step 1 is not a problem; I am able to generate $form. For step 2, I need $form_state.

Given $form, is there a way to programmatically generate its corresponding $form_state? I am using Drupal 6.

This is a more detailed explanation of what I am trying to accomplish. I am able to programmatically fill out and submit a particular form by laboriously setting all the field values in $form_state['values'], and then calling media_mover_api_add_config_form_submit($form, &$form_state);

However, the process would be much simpler if I could instead use this function, which converts a $configuration object into $form, and does all the heavy lifting:

$form = media_mover_api_configuration_base_form($configuration); 

This function enters a default value into each form field. The only missing step, then, is to copy all these default field values from $form to $form_state['values']. I am wondering whether there is a function to do this. Or is there a way to loop through all the fields in $form and extract the field-name and default value?

  

回答列表

1
 
vote
vote
最佳答案
 

这里是我用 $form 的默认值填充 $form_state['values'] 。:

  function mymodule_get_form_state($form){   $values = array();   _mymodule_form_get_values($form, &$values);   $form_state = array();   $form_state['values'] = $values;   return ($form_state); }  function _mymodule_form_get_values($element, &$values) {   foreach (element_children($element) as $key) {     if (isset($element[$key]) && $element[$key]) {       if (isset($element[$key]['#default_value']) && $element[$key]['#default_value']) {         $values[$key] = $element[$key]['#default_value'];       } else {         // Recurse through all children elements.         _mymodule_form_get_values($element[$key], &$values);       }     }   } }   
 

Here is what I did to fill $form_state['values'] with the default values from $form:

function mymodule_get_form_state($form){   $values = array();   _mymodule_form_get_values($form, &$values);   $form_state = array();   $form_state['values'] = $values;   return ($form_state); }  function _mymodule_form_get_values($element, &$values) {   foreach (element_children($element) as $key) {     if (isset($element[$key]) && $element[$key]) {       if (isset($element[$key]['#default_value']) && $element[$key]['#default_value']) {         $values[$key] = $element[$key]['#default_value'];       } else {         // Recurse through all children elements.         _mymodule_form_get_values($element[$key], &$values);       }     }   } } 
 
 
0
 
vote

fapi 是您的朋友和嵌入这个功能。

 

FAPI is your friend and embeds this functionality.

 
 
0
 
vote

form_state_defaults()将检索默认值。但你完全努力实现什么?我猜测,在某些时候,您想要提交一些值?你有帖子吗?

作为paul-m,我也猜测 media_mover_api_add_config_form_submit() 是注册为您提到的表单的提交函数的函数。按照上面调用此函数将无法正常工作。

您可以调用流程表单功能,这将建立它验证并提交它,如果适用。

IE: drupal_process_form($form['#form_id'], $form, $form_state);

 

form_state_defaults() will retrieve the default values. But what are you exactly trying to achieve? I'm guessing that at some point you want to set some values to be submitted? Do you have post data?

As paul-m I'm also guessing that media_mover_api_add_config_form_submit() is a function registered as the submit function for the form you mention. Calling this function as above won't work.

You can call the process form function though, which will build it validate and submit it if applicable.

ie: drupal_process_form($form['#form_id'], $form, $form_state);

 
 
 
 
0
 
vote

我会下注 media_mover_api_add_config_form_submit() 是注册为表单的提交函数的函数。也就是说,它不会"提交表单" ,当用户在Web浏览器中提交表单时,调用它。

表单API允许您注册函数以处理验证和提交表单。一般来说,你不打电话给这些;你让Drupal做到了。

我想这个明显的问题是:为什么你需要$ form_state?

这是形式API QuickStart指南。

更新:确定您的更新....

我很少了解媒体移动器,尽管它看起来很有用。通过代码戳戳,我建议如果您需要保存新配置,那么您只需执行它: $conf = new media_mover_configuration; /* set configuration here */ $conf->save(); 或者如果需要封装的方法,则配置配置。您也可能尝试询问项目

还,mm可能支持功能,如果有助于您。

 

I would wager that media_mover_api_add_config_form_submit() is a function registered as the submit function for a form. That is, it doesn't 'submit the form,' it is called when the user submits the form in their web browser.

Form API lets you register functions to handle validation and submission of forms. Generally, you don't call these; you let Drupal do it.

I suppose the obvious question is: Why do you need $form_state?

Here's a link to the Form API Quickstart Guide.

UPDATE: OK given your update....

I know very little about Media Mover, though it looks useful. Poking through the code, I suggest that if you need to save a new configuration, then you just do it: $conf = new media_mover_configuration; /* set configuration here */ $conf->save(); Or subclass the configuration if you need an encapsulated approach. You also might try asking the project's lead for guidance, and remind them to add more documentation to the code. :-)

Also, MM might support Features, if that helps you.

 
 
   
   

相关问题

1  使用表单和模板和_submit回调  ( Using forms and templates and submit callback ) 
我正在尝试在创建形式的过程中包装我的头,并使用 x_submit() 处理提交的数据。 我首先具有表单回调: function world_form(&$form_state) { // if ($form_state['post']) { drupal_set_message("Solved!"); } ...

0  “再次”AJAX呼叫多个节点在一页上添加表单  ( One more ajax call for multiple node add forms on one page ) 
我想要一个页面,初始节点添加表格(小尺寸),标题行和身体textarea 3x20尺寸; 和一个按钮"再用" AJAX呼叫,以显示另一个表单加上另一个按钮等。 当然,提交按钮始终在底部。 所以问题是...哪个模块? :)我几乎无法找到搜索条款! 更新:我想添加,这个任务似乎经常使用和模块化,所以我认为它会有一个模...

0  在成功Ajax提交后,如何清除已渲染“Drupal消息”? [复制]  ( How to clear already rendered drupal messages after successful ajax submit ) 
这个问题已经在这里有一个答案: 关闭 9年前。 可能的重复: 删除tabledrag状态ajax提交 后,ajax提交和显示状态消息 我有一种自定义表单,将节点的"权重" 保存到自定义表中。表...

0  在Drupal 7中使用Hook_Form_alter定位粘性场  ( Positioning sticky field using hook form alter in drupal 7 ) 
我正在尝试从选项栏中删除粘性选项并将其添加到用户表单中。 function vacancies_form_vacature_node_form_alter(&$form, &$form_state, $form_id) { // remove sticky field from default (option) ...

3  获取用户帐户表单  ( Get user account form ) 
我尝试了用户帐户表单(在登录用户的用户/%/编辑)的情况下,我尝试了: drupal_get_form('user_profile_form'); & drupal_get_form('user_profile_form',1); 虽然表格加载,但在调用 render() div是空的...

0  在FAPI TablesElect行中的Ajax链接  ( Ajax link in a fapi tableselect row ) 
我正在尝试将ajax链接添加到我的tablemelect行并用ajax替换这张表单的一部分。 /** * Implements hook_operations_menu() */ function implementing_operations_menu() { $links = []; // Defi...

0  节点表单上的额外折叠字段集  ( Extra collapsed fieldset on node form ) 
我在我的节点表单上有一个额外的折叠输入格式字段集。它以上所有其他元素都出现与任何字段无关,我无法判断它来自哪里。不确定如何调查源的位置。 我猜测MultiSep模块是原因,但我需要至少找出表格来自的字段。 ...

1  #required属性不会让我重定向一个drupal 7表格  ( Required attribute not letting me to redirect a drupal 7 form ) 
我有一个带有2个按钮的表单。一个是一个提交按钮,另一个是单击时的简单按钮,必须将页面重定向到另一个页面。(我的意思是即使他没有填写整个形式,也必须重定向) 所以提交按钮后,我为另一个元素提出以下代码 <?php $form['health_calorie_consume']['view'] = array( ...

1  仅在传递默认验证后才能验证  ( Additional form validation only after passing default validation ) 
在Drupal 6.25中。 我正在构建自定义用户注册表单,在正确传递默认表单验证之后,需要在外部服务上运行一些操作,但在Drupal中创建新的用户记录之前。到目前为止,我正在进行以下操作: function mbrusers_form_alter(&$form, &$form_state, $form_id){...

2  默认管理员用户/人员搜索表单中的电子邮件过滤器  ( Email filter in default admin users people search form ) 
我希望Drupal7默认管理员用户/人员搜索表单中的额外筛选器(电子邮件文本输入)。有没有模块,因为我找不到drupal7的模块? 我发现另一种方式是使用视图,但我希望使用附加输入过滤器的默认搜索表单。 ...

2  删除<div类=“form-item”>围绕表单项  ( Remove div class form item around form items ) 
我想尽可能多地使用 http:// twitter。 github.com/bootstrap/base-css.html#forms 对于我的主题,作为我的一部分,我真的想要摆脱正在围绕每个<代码包裹的 <div class="form-item"> > <input> 元素。 据我所知,唯一的方法是通过复制整个...

0  记住表单的呼叫页面的地址(Drupal 7)  ( Remembering the address of the calling page of a form drupal 7 ) 
我创建了一个偶然的模块,它实现了hook_menu,并且选择菜单项时,它会显示一种定义的表单: {...}0 现在选择此菜单项时,它会在地址发出一种表单?q = documentation_menu和我的表单提交挂钩我想返回用户在选择菜单项之前的页面,但我可以'要弄清楚如何访问和/或存储此路径。 ...

0  如何在表单构建器中获取$语言对象?  ( How do i get the language object inside a form builder ) 
我有这种不可用的necesity在 MY_MODULE_form($form, &$form_state) 函数中使用$语言,似乎不可用。我试图将其定义为全局,但它显示空白。 global $language_content; dpm($language_content->language); 我的简化结构...

2  Drupal变量的默认值  ( Default value to drupal variable ) 
我有一段代码,我希望将默认值具有变量,但是如果未设置变量,我需要知道如何设置默认值: $form['background_audio_height'] = array( '#type' => 'textfield', '#title' => t('Subject'), '#default_value' => ...

0  file_save()中的错误  ( Error in file save ) 
我在我的模块中有一个配置页面,您可以上传文件并更改一些其他设置。如果您在单击"保存" 时,请正常工作,如果您没有上传文件并尝试更改设置时,请达到此错误: Argument 1 passed to file_save() must be an instance of stdClass, boolean give...

1  ajax表单提交多次  ( Ajax form submit multiple times ) 
我有一个由一个提交按钮组成的表单(添加到购物车)。我通过ajax提交了它,但问题是当我按下第二或第三(等等)次的按钮时,提交处理程序不会执行。我认为这是因为 form_build_id 和 form_token 字段应该重建。 您是否知道如何实现此功能? 这是我正在使用的代码。 function mymodul...

2  需要强制#default_value for ajax tableselect复选框  ( Need to force default value for ajax tableselect checkboxes ) 
我构建了一个下拉ajax寻呼机,它用Rows的请求页面替换TableSelect。所选项目ID数组存储在隐藏字段中,逻辑正在跨实体加载/保存和Ajax替换。 当表单最初加载时,我的tableSelect #default_value正确运行并检查第一页上所选的行。但在Ajax通过大列表中分页到不同的页面和后面,再次检...

0  如何将数据从一个表格生成器传递给另一个表单生成器?  ( How do i pass data from one form builder to another ) 
我有一个页面回调,这是: // ... $page['search'] = drupal_get_form('search_form'); // ... $page['list'] = drupal_get_form('list_form'); // ... return $page; 第一个表单构建一个搜...

0  鉴于一种形式,如何找到它们中存在的字段?  ( Given a form how do i find the fields present in them ) 
如何获取以某种形式存在的字段列表,我知道表单ID,我只需要在该表单中存在的字段的名称? ...

2  实体内部实体子表格处理的示例  ( Example of entity within entity subform processing ) 
假设在Drupal 7中,EntityA包括一个或多个EntityB的实例。 是构建包含一个或多个EntityB的EntityA的创建/编辑表单的示例,它可以为新EntityB的新创建表单中的Ajax? ...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.