尽管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';
}