如何在另一个页面上显示node / add / sometype表单?

时间:2011-03-17 20:20:53

标签: drupal drupal-7

整个问题如下:

让我们说项目,项目可以有投标,项目可以有问题,问题可以有答案。

显示项目时,还应显示与该项目关联的所有内容。此外,根据角色的不同,应显示某些形式以进行投标,提问和重播答案。

如何实现这一目标?我应该为每种类型分别设置节点类型吗?或者我应该将问题和答案等一些子类型视为评论?我应该使用一些众所周知的模块吗?

我正在使用Drupal 7,我尝试编写自定义模块,但我没有让它正常工作。

9 个答案:

答案 0 :(得分:35)

module_load_include('inc', 'node', 'node.pages');

$form = node_add('nodetype');
$output = drupal_render($form);

如果您的节点表单有文件上载小部件,则应将以下行添加到菜单数组中:

'file path' => drupal_get_path('module', 'node'),
'file' => 'node.pages.inc',

答案 1 :(得分:20)

要获取节点编辑表单,您需要包含node.pages.inc

<?php
  // required for Drupal 6
  module_load_include('inc', 'node', 'node.pages'); 
  // which nodeform you want
  $node_type = 'YOURNODETYPE';
  $form_id = $node_type . '_node_form';
  // maybe add current users info
  global $user;
  // create a blank node
  $node = array(
    'uid' => $user->uid,
    'name' => (isset($user->name) ? $user->name : ''),
    'type' => $node_type,
  );
  // Invoke hook_nodapi and hook_node
  node_object_prepare($node);
  // Or you can also use an exiting node, for example
  // $node = node_load(123);
  // and the display the form:
  $output = drupal_get_form($form_id, $node);
?>

答案 2 :(得分:5)

// Drupal 7    
// Embed node creation form on a custom page inside module.
module_load_include('inc', 'node', 'node.pages');
$form = node_add('node_machine_name'); 
return drupal_render($form);

答案 3 :(得分:4)

模块Form Block是在网页上嵌入节点表单的最简单方法。然后我将使用带有块显示和参数的视图来显示这些相关节点的表格列表。

尽管Drupal 7评论模块是基于字段构建的,但它确实不够灵活,不能用于评论。如果您希望您的子类型具有标题和正文,那么评论可能就是您的选择。如果您只想要自定义字段,则可以使用节点,并可能使用Automatic Nodetitles之类的内容。

2014年更新:如果您希望查看Advanced Form Block模块,则首选添加无编码的块,这会为您的标准块添加一些功能(您可以添加任意数量的功能,制作它们都通过AJAX提交,甚至可以选择你想要的字段。与Form Block模块不同,它仍然为Drupal 7维护。

答案 4 :(得分:2)

在Drupal 7中,需要将空白节点创建为对象(而不是数组)。

  $node->uid = $user->uid;
  $node->name = (isset($user->name) ? $user->name : '');
  $node->type = $node_type;
  $node->language = '';

答案 5 :(得分:2)

托马斯的回答对我来说很好看:Formblocks和自动节点标题。我认为您可以使用Nodereference URL Widget扩展它 - 使用nodereferences而不是注释,并让该模块完成保持子节点连接到其父节点的工作。

答案 6 :(得分:1)

要获得在d7中工作的dobeerman示例(接受的答案),请添加'language'=&gt; LANGUAGE_NONE并将$ node数组转换为对象。即:

$node = (object)array(
  'uid' => $user->uid,
  'name' => (isset($user->name) ? $user->name : ''),
  'type' => $node_type,
  'language' => LANGUAGE_NONE
);

答案 7 :(得分:1)

我正在复制对我有用的解决方案。它可以作为Drupal.org上的答案提供,它可以帮助其他人遇到我遇到的同样问题。

答案可在此处找到:https://www.drupal.org/node/1336212#comment-6192404

我正在下面复制粘贴:

在自定义回调中或在hook_form_alter中,调用...

<?php
form_load_include($form_state, 'inc', 'node', 'node.pages');
?>

... ... OR

<?php
form_load_include($form_state, 'inc', 'user', 'user.pages');
?>

...取决于您正在加载的核心Drupal形式是节点表单还是用户表单。

答案 8 :(得分:1)

这就是我解决问题的方法:

在我的hook_menu

$items['add-visiteur'] = array(
  'title' => 'Add',
  'page callback' => 'add_visiteur',
  'access arguments' => array('access content'),
  'type' => MENU_CALLBACK,
);

和我的回调函数

function add_visiteur() {
  module_load_include('inc', 'node', 'node.pages'); 
  // which nodeform you want
  $node_type = 'visiteur';
  $form_id = $node_type . '_node_form';
  // maybe add current users info
  global $user;
  // create a blank node
  $node = new stdClass;
  $node->uid = $user->uid;
  $node->name = (isset($user->name) ? $user->name : '');
  $node->type = $node_type;

  // Invoke hook_nodapi and hook_node
  node_object_prepare($node);

  $output = drupal_get_form($form_id, $node);
  return $output;
}