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

Drupal 如何在另一页上显示node/add/sometype表单?,drupal,drupal-7,Drupal,Drupal 7,整个问题如下: 假设我们有项目,项目可以有出价,项目可以有问题,问题可以有答案 显示项目时,还应显示与此项目关联的所有内容。此外,根据角色的不同,还应显示某些投标、提问和重播答案的表格 如何做到这一点?我应该为每种类型指定单独的节点类型吗?或者我应该将一些子类型(如问题和答案)视为注释?我应该为此使用一些知名的模块吗 我正在使用Drupal 7,我试图编写一个自定义模块,但没有正常工作。要获得节点编辑表单,需要包括 该模块是在页面上嵌入节点表单的最简单方法。然后,我将使用带有块显示和参数的视图

整个问题如下:

假设我们有项目,项目可以有出价,项目可以有问题,问题可以有答案

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

如何做到这一点?我应该为每种类型指定单独的节点类型吗?或者我应该将一些子类型(如问题和答案)视为注释?我应该为此使用一些知名的模块吗


我正在使用Drupal 7,我试图编写一个自定义模块,但没有正常工作。

要获得节点编辑表单,需要包括


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

尽管Drupal7注释模块是基于字段构建的,但对于非注释类的东西来说,它确实不够灵活。如果你想让你的子类型有一个标题和正文,那么评论可能是最好的选择。如果您只需要自定义字段,那么可以使用一个节点,并可能使用类似的方式


2014年更新:如果您希望签出模块的任何人都喜欢添加不带编码的块,该模块会为您的标准块添加一些功能(您可以添加任意数量的块,让它们都通过AJAX提交,甚至可以选择您想要的字段)。与表单块模块不同,Drupal 7仍然积极维护.Drupal 7中的

< P>:空白节点需要创建为对象(不是数组)。p>
托马斯的答案在我看来很好:Formblocks,也许还有自动节点。我认为您可以通过使用节点引用而不是注释来扩展它,并让该模块完成保持子节点与其父节点连接的工作

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',

要使dobeerman的示例(公认的答案)在d7中工作,请添加'language'=>language_NONE并将$node数组强制转换为对象。i、 e:

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

我正在复制对我的案例有效的解决方案。这可以在Drupal.org上找到答案,它可以帮助其他人解决我遇到的同样问题

答案可在此处找到:

我正在将其复制粘贴到下面:

在自定义回调或hook\u form\u alter中,调用

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

……或者

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


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

我就是这样解决问题的:

在我的菜单上

$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;
}

“创建空白节点”部分对Drupal7不起作用,但我找到了一个解决方案。谢谢上面的代码对于d7是错误的。正如下面所说的@user462645,$node变量必须是一个对象模块_load_include('inc','node','node.pages')$节点类型='yournodetype'$form_id=$node_type_节点_形';全球$用户$node=新stdClass()$节点->uid=$user->uid$节点->名称=(isset($user->name)?$user->name:“”)$节点->类型=$node\u类型$节点->语言=“”;节点\对象\准备($node);返回drupal\u get\u form($form\u id,$node)@**user506259**您的解决方案是什么?此方法在drupal 7中返回错误,但
Marius Ilie
解决方案工作正常。要使dobeerman的示例在d7中工作,请添加“language”=>language\u NONE并将$node数组强制转换为对象。i、 例如:您可以添加一个关于如何“向菜单数组添加以下行”的示例吗?函数yourmodule\u menu\u alter(&$items){$node\u path=drupal\u get\u path('module','node');$items['system/ajax']=$node\u path;$items['system/ajax']['file']='node.pages.inc}谢谢你的回答对我帮助很大:D
关于文件上传小部件
@MariusIlie我对drupal是新手,所以我把这个代码放进去了。我在hook_node_视图中尝试过,在这个hook中我添加了$output,比如$node->content['article]=$output;但什么也没发生。因此,在渲染之后,如何将其附加到节点视图?如果(!function_exists('node_add')){module_load_include('inc','node','node.pages');}在Drupal7上运行良好,则最好在代码中添加这一行!你能回答这个吗?你能回答这个吗
<?php
form_load_include($form_state, 'inc', 'user', 'user.pages');
?>
$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;
}