web-dev-qa-db-ja.com

「ノード追加」フォームをページに埋め込む

ランディングページに「ノード追加」フォームを埋め込む方法を探しています。 Form Block を使用していましたが、開発スナップショットバージョンを使用していたため、多くのエラーが発生するようです。

18
ousneo

以下を使用できます。

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

ダニエルウェナーの answer は完全に正しく機能していますが、このアプローチで直面した2つの一般的な問題と、それらの問題を回避するための回避策を追加したいと思いました。最初に私のコード、次に説明:

_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)
_

ダニエルの単純な _node_add_ の代わりに、なぜ私はこのようにしたのですか?

問題1: node_add() 関数がページタイトルをCreate 'node type'に変更する、これは難しい関数でコーディングされます。

回避策1:_node_add_関数を使用する代わりに、コードをコピーして_drupal_set_title_を削除しました。上記のコードは、この1行を除いて、_node_add_関数と同じコードです。

問題2:埋め込み形式では、一部のajax関数が機能しませんでした。たとえば、無制限の値を持つことができるフィールドがあるために、[別のアイテムを追加]ボタンがある場合、またはフォームにファイルのアップロードフィールドがある場合、それらは機能しません。

回避策2:カスタムモジュールで、ajax呼び出しパスに hook_menu_alter() を実装し、_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';
}
_
16
Елин Й.

承認された回答のコードを使用すると...

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;
0
alec