在页面中嵌入“节点添加”表单


19

我正在寻找一种在目标页面上嵌入“节点添加”表单的方法。我使用的是Form Block,但由于使用的是开发快照版本,因此似乎带来很多错误。


1
如果您在表单块方面遇到特定的问题,那么最好的去处可能是该模块的问题队列。
杰里米·法兰西

Answers:


28

您可以使用:

module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);

3
如果收到node_add()未定义的错误,则需要if (!function_exists('node_add')) { module_load_include('inc', 'node', 'node.pages'); }在开始处添加。该信息来自此处:(kahthong.com/2012/01/embed-drupal-node-form-anywhere
mbrakken

有没有办法将其阻止?还是必须将其包含在tpl.php文件中?

我无法将代码用于带有Ajax元素的表单(例如:文件上传)。可能的解决方案
Dimetry

@Dimetry看到了在嵌入式节点形式中使用Ajax元素的答案
ЕлинЙ.

16

尽管Daniel Wehner的答案是绝对正确且可行的,但我想补充一下此方法遇到的两个常见问题,以及解决这些问题的解决方法。首先是我的代码,然后是解释:

global $user;
module_load_include('inc', 'node', 'node.pages');
$node = (object) array(
  'uid' => $user->uid,
  'name' => (isset($user->name) ? $user->name : ''),
  'type' => 'YOUR_NODE_TYPE',
  'language' => LANGUAGE_NONE,
);
$form = drupal_get_form('YOUR_NODE_TYPE . '_node_form', $node);

print drupal_render($form)

为什么我这样做而不是Daniel的简单方法node_add

问题1:node_add()函数将页面标题更改为Create'node type',这在函数中进行了硬编码。

解决方法1:node_add我没有使用函数,而是复制了代码并删除了drupal_set_title。上面的代码与该node_add函数相同,但这一行除外。

问题2:在嵌入式形式中,某些ajax函数无法正常工作。例如,如果您有一个可以具有无限值的字段,那么您有一个“添加其他项目”按钮,或者如果您的表单中有一个上载文件字段,则它们不起作用。

解决方法2:在您的自定义模块中,实现hook_menu_alter()Ajax调用路径,并包含node.pages.inc

function YOURMODULE_menu_alter(&$items) {
  $items['file/ajax']['file path'] = drupal_get_path('module', 'node');
  $items['file/ajax']['file'] = 'node.pages.inc';
  $items['system/ajax']['file path'] = drupal_get_path('module', 'node');
  $items['system/ajax']['file'] = 'node.pages.inc';
}

内联Entityform是否可以替代?我一直在使用该模块,但是无法在前端显示节点添加表单,只有在编辑节点时,您才可以提供一个实体引用字段来显示节点添加表单。
AlxVallejo 2014年

1
内联Entityform用于实体参考字段,与该问题无关。
ЕлинЙ.

1
如果您不想使用hook_menu_alter()进行文件上载等,则可以改为在节点形式的alter中添加include: function YOURMODULE_form_NODETYPE_node_form_alter(&$form, &$form_state) { form_load_include($form_state, 'inc', 'node', 'node.pages'); }
joe_flash 2015年

@ЕлинЙ。您的答案适用于这个问题吗?
Umair

1
@Umair我的答案仅是关于在页面上添加节点表单。它既不会通过AJAX提交表单,也不会更新视图。但是,您可以使用AJAX Framework实现这些目标。
ЕлинЙ.

0

如果我使用接受的答案的代码...

module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);

...在页面回调函数内部,则print drupal_render..导致页面完全没有主题(外观破损)。

因此,我只是return编辑了$form

module_load_include('inc', 'node', 'node.pages');
$form = node_add('program_registration');
return $form;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.