如何通过自定义表单更新节点? -- forms 领域 drupal 相关 的问题

How do I update a node via a custom form?


2
vote

问题

中文

我在提交时建立​​了自定义表单(在模块中)在数据库中创建多个相关节点。现在,我需要创建一个模块,以便用户可以在以后更新他/她提交的表单数据。这是我的粗略计划:

(1)确定用户想要在请求的URL中通过通配符更新的节点; (2)从数据库中检索所需的数据; (3)构建表单并通过#Value属性插入检索到的数据库值; (4)Buand一个使用DB_Update的提交函数更新节点

是通过自定义表单更新节点的正确方法?到目前为止,这是我的(不工作)模块代码:

  // Implements hook_menu(). function update_card_menu() {     $items['update-card/%update_card'] = array(         'page callback' => 'update_card_form',         'page arguments' => array(1),         'access callback' => TRUE,     );     return $items; }  // Database query function. function update_card_load($nid) {     $query = db_select('node', 'n');     $query -> condition('nid', $nid);     $query -> join('card_number', 'cn', 'n.nid = cn.entity_id');     $nodes = $query     -> fields('n', array('nid', 'title'))     -> fields('cn', array('field_card_name_nid'))     // This query will get more complex - I need more nodes and more fields     -> execute();     foreach ($nodes as $field) {         $card['nid'] = $field -> nid;         $card['card number'] = $field -> field_card_number_nid;     }     return $card; }   

$ card现在包含一些我想要填充我的更新表单的值:

数组([nid] => 123 [卡号] => 456)

但是如何将$卡送入我的表单构建器功能,以便我可以从此数组填充我的#Value属性?我的代码不起作用。

  /**  * Renderable form array return function.  */ function update_card_form() {     return drupal_render(drupal_get_form('update_card_capture')); }  /**  * Form builder function.  */ function update_card_capture($form, &$form_state, $card) {     $form['nid'] = array(         '#title' => t('nid'),         '#type' => 'textfield',         '#value' => $card->nid     );         $form['card number'] = array(         '#title' => t('Card number'),         '#type' => 'textfield',         '#value' => $card->card_number     ); }   
英文原文

I have built a custom form (in a module) that creates several related nodes in the database when submitted. Now, I need to create a module so that a user can update his/her submitted form data at a later date. Here's my rough plan:

(1) Determine the nodes that the user wants to update via a wildcard in a requested url; (2) retrieve the required data from the database; (3) build a form and insert the retrieved database values via the #value property; (4) bulid a submit function that uses db_update to update the node

Is this the right approach for updating a node via a custom form? Here's my (not working) module code so far:

// Implements hook_menu(). function update_card_menu() {     $items['update-card/%update_card'] = array(         'page callback' => 'update_card_form',         'page arguments' => array(1),         'access callback' => TRUE,     );     return $items; }  // Database query function. function update_card_load($nid) {     $query = db_select('node', 'n');     $query -> condition('nid', $nid);     $query -> join('card_number', 'cn', 'n.nid = cn.entity_id');     $nodes = $query     -> fields('n', array('nid', 'title'))     -> fields('cn', array('field_card_name_nid'))     // This query will get more complex - I need more nodes and more fields     -> execute();     foreach ($nodes as $field) {         $card['nid'] = $field -> nid;         $card['card number'] = $field -> field_card_number_nid;     }     return $card; } 

$card now contains some values I want to populate my update form:

Array ( [nid] => 123 [card number] => 456 )

But how do I get $card into my form builder function, so that I can populate my #value properties from this array? My code does not work.

/**  * Renderable form array return function.  */ function update_card_form() {     return drupal_render(drupal_get_form('update_card_capture')); }  /**  * Form builder function.  */ function update_card_capture($form, &$form_state, $card) {     $form['nid'] = array(         '#title' => t('nid'),         '#type' => 'textfield',         '#value' => $card->nid     );         $form['card number'] = array(         '#title' => t('Card number'),         '#type' => 'textfield',         '#value' => $card->card_number     ); } 
  
     
     

回答列表

3
 
vote

需要使用hook_menu()注册路径和回调函数,如:

  <?php function hook_menu() {   $items['some-path/%node'] = array( // %node will use the node_load() function that's already provided by node.module.     'type' => MENU_CALLBACK // This is just a callback item, it will not appear in any "menus"     'page callback' => 'drupal_get_form'     'page arguments' => array('the_form_function_name', 1) // Where 1 = the %node wildcard     'access callback' => 'node_access',     'access arguments' => array('update', 1), // The user must be able to update the node   );   return $items; } ?>   

然后构建一个简单的表单,该表单提供要在节点上更改的字段,并在提交处理程序中运行 node_save() ,以保存您对节点的任何修改。

  <?php function the_form_function_name($form, &$form_state, $node) {   drupal_set_title('Now editing node ' . check_plain($node->title));    // Just store the entire $node object in a custom form property. Easy.   $form['#node'] = $node;    // An example form field that we'll use to update the node's title.   $form['new_title'] = array(     '#title' => 'Title',     '#type' => 'textfield',     '#default_value' => $node->title,   );    $form['submit'] = array(     '#type' => 'submit',     '#value' => 'Save Node',   );    return $form; }  function the_form_function_name_submit(&$form, &$form_state) {   $form['#node']->title = $form_state['values']['new_title'];   // Save the modified node object (http://api.drupal.org/node_save)   if (node_save($form['#node'])) {     drupal_set_message('Updated the node.');   } else {     drupal_set_message('Could not update the node.', 'error');   } } ?>   

这只是样本代码 - 我没有测试,但它应该禁止任何拼写错误。

您将通过以下方式击中: http://example.com/some-path/123其中123是要编辑的节点的节点ID。

 

You need to use hook_menu() to register the path and callback function, like so:

<?php function hook_menu() {   $items['some-path/%node'] = array( // %node will use the node_load() function that's already provided by node.module.     'type' => MENU_CALLBACK // This is just a callback item, it will not appear in any "menus"     'page callback' => 'drupal_get_form'     'page arguments' => array('the_form_function_name', 1) // Where 1 = the %node wildcard     'access callback' => 'node_access',     'access arguments' => array('update', 1), // The user must be able to update the node   );   return $items; } ?> 

Then build a simple form that provides fields to alter on the node, and run node_save() in the submit handler to save any modifications you make to the node.

<?php function the_form_function_name($form, &$form_state, $node) {   drupal_set_title('Now editing node ' . check_plain($node->title));    // Just store the entire $node object in a custom form property. Easy.   $form['#node'] = $node;    // An example form field that we'll use to update the node's title.   $form['new_title'] = array(     '#title' => 'Title',     '#type' => 'textfield',     '#default_value' => $node->title,   );    $form['submit'] = array(     '#type' => 'submit',     '#value' => 'Save Node',   );    return $form; }  function the_form_function_name_submit(&$form, &$form_state) {   $form['#node']->title = $form_state['values']['new_title'];   // Save the modified node object (http://api.drupal.org/node_save)   if (node_save($form['#node'])) {     drupal_set_message('Updated the node.');   } else {     drupal_set_message('Could not update the node.', 'error');   } } ?> 

This is just sample code xe2x80x93 I have not tested, but it should work barring any typos.

You would hit this via: http://example.com/some-path/123 where 123 is the node ID of the node you want to edit.

 
 
         
         
0
 
vote

点1:实现 hook_menu()

代码应该是这样的:

  $items['my-view/%'] = array(   'page callback' => 'mymodule_create_form', // Function name that create the form   'page arguments' => array(1), // You pass the wildcard(%) value, in this case, the id of the node that you will use to load with node load() )   

点2:始终node_load()。它会让你有机会与钩子采取行动,您可以在不触摸查询的情况下添加或删除字段。

点3:我会重复使用您在添加节点时创建的表单。您必须使用#value属性填充表单中的字段。

点4:node_save()。更新了在第2点中加载的节点对象。

 

Solution for point 1: Implement hook_menu()

The code should be something like this:

$items['my-view/%'] = array(   'page callback' => 'mymodule_create_form', // Function name that create the form   'page arguments' => array(1), // You pass the wildcard(%) value, in this case, the id of the node that you will use to load with node load() ) 

Point 2 : Always node_load(). It will give you the chance to act with hooks and you will can add or delete fields without touch the querys.

Point 3: I would reuse the form that you`ve created when a node is added. You will have to fill the fields in form using #value property.

Point 4: node_save(). Updated the node object that you loaded in point 2.

 
 
       
       

相关问题

39  添加CSS和JS以形成附件  ( Adding css and js to form with attachments ) 
我需要将一些外部和本地CSS和JavaScript文件添加到表单中,但我似乎无法找到正确的方法。我只需为JS和CSS文件添加路径和URL? 我假设 $form['#attached']['css'][] 和 $form['#attached']['js'][] 是正确的代码,所以他们在形式重建时得到重新加载。我似乎错...

0  以编程方式在自定义表单中添加现有实体引用自动完成字段  ( Programmatically add an existing entity reference autocomplete field in custom f ) 
我需要创建自定义表单并将实体参考字段添加到它。该字段使用自动填充功能,查看实体选择。该字段已存在于节点上,但我也需要它在自定义模块中。是否有一种方法可以在带有 MYMODULE_MYFORM_form() 的自定义模块中添加此字段?? ...

2  WebForm作为保修表  ( Webform act as warranty form ) 
我是一个新手,在需要使用webform作为保修表单的项目上工作,表单有一个日期字段。在用户提交表单后,提交结果页面应显示保修的到期日,但我不知道到期日如何显示?可以帮助我如何做到这一点?百万感谢 ...

2  为什么我的自定义表单元素主题函数是否正在调用?  ( Why isnt my custom form element theme function being called ) 
在我的模块中,我有一个返回表单的函数: function mymodule_myform($form, &$form_state) { $form['fs_refine'] = array('#type' => 'fieldset'); $form['fs_refine']['refine'] =...

2  如何知道是否正在通过AJAX请求调用form_alter?  ( How to know if a form alter is being invoked through an ajax request ) 
我正在使用hook_id_form_alter更改节点添加表单,如果查询参数缺少强制性令牌值,我正在执行drupal_goto。现在,在"添加节点" 表单中,有一个图像字段。当我尝试上传那个是没有令牌的Ajax请求时,窗格_ alter函数被调用,因此失败。 任何帮助都得到了赞赏! ...

6  添加字段以动态地使用Ajax和检索值表格  ( Add fields to form dynamically with ajax and retrieve values ) 
我正在尝试使用Drupal 7 Ajax在单击按钮时动态地添加文本字段和选择框的组合。 但我这里有2个问题: 我无法在使用ajax 中添加超过1组的字段中的字段 提交表单后,我无法检索表单的值。他们是空的。我将字段为"name_1" ,"select_1" ,"name_2" ,"select_2" 等。 我想知...

1  如何摆脱默认字段标记  ( How to get rid of the default field markup ) 
我需要自定义注册表单字段。 Drupal生成如下所示字段: <div> <label>Name</label> <input type="text"> </div> 但我需要离开 <input> 并能够在它周围添加一些其他标记。 例如: <ul> <li><span>Name</span><inpu...

6  在提交处理程序中使用form_set_error  ( Using form set error in the submit handler ) 
我有一个multiSep形式,每次提交我将完成的字段发送到外部API,返回关于表单的下一步的数据。 问题是,如果在提交处理程序中使用form_set_error,则清除form_storage,因此表单重置为第一页。 这是一个任意的例子; function example_form($form, &$form_...

0  自定义站点管理表单/页面  ( Custom site administration form page ) 
我希望在我的网站上创建一个页面,允许某些用户执行管理任务,而无需将其访问整个管理后端。 我想创建一个页面/形式,允许我的用户: 更改默认徽标(如在外观页面上) 更改网站口号 将站点放入维护模式/更改维护模式 文字 我毫无疑问没有模块在那里有这种能力,所以我认为我要使用形式的API,但我想知道是否有人可以给我一个正...

0  PHP要使用PHP命令创建具有默认内容的文本字段?  ( Php to create text field with default content from php command ) 
我们有一个包含代码:的块 <?php print token_replace('[current-page:url]'); ?> 哪个是最需要的,它只是镜像包含用户填充内容的唯一视图页面的URL。 [目的是用于共享用户的列表选择。但在这种情况下,一般"共享" 模块/功能不合适,最好为用户提供复制到电子邮件中...

3  标签多页ajaxified表格  ( Tabbed multipage ajaxified forms ) 
我需要一种方法来在底部的顶部"保存和下一个" /"保存和返回" 导航,并使用ajax保存数据的数据,并使用以下业务规则将数据保存为单个页面: -a用户可以随时访问和在表单的任何部分中工作。 - 可以保存单独的页面,即使表格的其余部分中没有任何内容,也可以填写。 -Changes在任何页面中导致"退出而不保存?...

1  无法在Drupal 7中提交表格  ( Cannot submit forms in drupal 7 ) 
当我在drupal 7中提交表单(所有表格),它显示了您的配置设置已保存消息,但表单值仍然与提交前的值相同。我已经清除了缓存,但问题仍然存在。 任何建议? ...

1  切换文本字段根据Drupal 6中的复选框值  ( Toggle text field depending on checkbox value in drupal 6 ) 
我需要根据复选框值切换文本框。 基本上我需要拍摄电子邮件条目进行更新。 以下是我使用的表单元素。 $form['chkupdates'] = array( '#type' => 'checkbox', '#title' => t('Sign up to receive email...

1  填充#Options的选择字段  ( Fill options of select field ) 
我有一个选择字段,用于内容类型,其具有动态生成的选项。选项在hook_form_alter()中更新。问题是,当我尝试在提交回调中操作发布的数据时,字段值为空。以下是更好地理解问题的示例。 function my_form_alter(&$form, &$form_state) { $options = ...

3  如何在表单顶部显示表单按钮?  ( How can i display a form button on top of the form ) 
在我的自定义模块中,我使用以下代码添加了一个按钮到节点编辑表单。 $form['actions']['my_submit'] = array( '#type' => 'submit', '#value' => t('My custom action'), '#weight' => -1...

2  form_set_error在多个值字段中突出显示单个字段  ( Form set error highlight single field in multiple value field ) 
当此字段属于多个值字段时,是否可以使用Form_Set_Error突出显示一个字段。假设我有一个字段名称_videos,它接受倍数值。运行验证后,只有视频#2无效: form_set_error('field_videos', t('Video URL not valid')); 如何告诉Drupal只突出...

0  hook_form_alter构建动态文本字段  ( Hook form alter building dynamic textfields ) 
在hook_form_alter中我正在从数据库中获取数据。一些数据有几个文本字段,让我们说地址。人们可以有几个地址。 如何将行数传递给我的表单,并将其与行计数呈现? 我尝试在hook_form_alter中执行以下操作 function personalinfo_form_alter(&$form, &$for...

6  表单API选择列表不会显示空选项  ( Form api select list will not show empty option ) 
我正在尝试添加一种迫使您从下拉列表中选择选项的表单。该文件说: 如果#required为true并且没有#default_value,一个空的选项 将添加到SELECT控件中以强制用户进行活动状态 选择。 http://api.drupal.org /api/drupal/developer%21to...

2  2提交相同的验证?  ( 2 submits with same validation ) 
我正在修改user_pass,以便它还可以选择重新发送用户的激活电子邮件。 if($form_id=='user_pass'){ $form['name']['#title'] = 'Email Address'; $form['actions']['submit'] = array(); ...

2  试图了解我在哪里发出错误修改用户注册表单  ( Trying to understand where i am going wrong modifying user registration form ) 
我正在使用Drupal作为学生项目的一部分。作为背景,我在专业地进行前端开发,并且至少在后端的基础上教授自己。 这是我的问题,我的表单设置为预期,它在击中提交按钮时验证,并创建用户。但是,没有任何自定义字段填充DB。我已经尝试过这么多不同的方法/教程,并且实际上没有工作。如果没有写咆哮,这一直非常令人沮丧,因为它在...




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


Licensed under cc by-sa 3.0 with attribution required.