ランディングページに「ノード追加」フォームを埋め込む方法を探しています。 Form Block を使用していましたが、開発スナップショットバージョンを使用していたため、多くのエラーが発生するようです。
以下を使用できます。
module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
ダニエルウェナーの 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';
}
_
承認された回答のコードを使用すると...
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;