web-dev-qa-db-ja.com

node / add / sometypeフォームを別のページに表示する方法は?

全体の問題は次のとおりです。

アイテムがあり、アイテムに入札があり、アイテムに質問があり、質問に回答があるとします。

アイテムが表示されると、このアイテムに関連付けられているすべてのコンテンツも表示されます。さらに、役割に応じて、入札、質問、回答のリプレイを行うための特定のフォームを表示する必要があります。

これを達成する方法は?各タイプに個別のノードタイプを使用する必要がありますか?または、質問と回答のようなサブタイプをコメントとして扱う必要がありますか?このためにいくつかの有名なモジュールを使用する必要がありますか?

Drupal 7を使用しています。カスタムモジュールを記述しようとしましたが、正常に動作しませんでした。

33
user506259

ノード編集フォームを取得するには、 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);
?>
20
dobeerman
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',
35
Marius Ilie
// 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);
5
Kendrick

Module Form Block は、ノードフォームをページに埋め込む最も簡単な方法です。次に、ブロック表示と引数を持つビューを使用して、これらの関連ノードの表形式のリストを表示します。

Drupal 7コメントモジュールはフィールド上に構築されますが、実際には、物事のような非コメントに対して十分な柔軟性がありません。サブタイプにタイトルと本文が必要な場合、コメントはおそらくカスタムフィールドだけが必要な場合は、ノードを使用して、おそらく Automatic Nodetitles のようなものを使用します。

2014年の更新:コーディングなしでブロックを追加することが好まれる場合は、標準ブロックにいくつかの機能を追加する Advanced Form Block モジュールをチェックアウトできます(好きなだけ追加できます) 、すべてをAJAX経由で送信し、必要なフィールドを選択することもできます)。FormBlockモジュールとは異なり、Drupal 7。

4
Thomas4019

トーマスの答えは私には良さそうです:フォームブロックとおそらく自動ノードタイトル。 Nodereference URL Widget -を使用して、コメントではなくノード参照を使用し、そのモジュールが子ノードを親に接続したままにするようにすることで、さらに拡張できると思います。

2
user721183

Drupal 7では、空のノードをオブジェクトとして(配列ではなく)作成する必要があります。

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

これは私が問題を解決した方法です:

私の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;
}
1

Dobeermanの例(受け入れられた答え)をd7で機能させるには、 'language' => LANGUAGE_NONEを追加し、$ node配列をオブジェクトにキャストします。すなわち:

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

私は私のケースで私のために働いた解決策を再現しています。 Drupal.orgで回答として入手でき、私が経験した同じ問題を抱えている他の人を助けるかもしれません。

答えはここにあります: https://www.drupal.org/node/1336212#comment-6192404

以下にコピー&ペーストしています:

カスタムコールバックでOR hook_form_alterで、次のいずれかを呼び出します...

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

...または...

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

...ロードするコアDrupalフォームがノードフォームかユーザーフォームかによって異なります。

1
Marcos Buarque