ダニエルウェーナーの答えは完全に正しいものですが、このアプローチで直面した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
。上記のコードは、node_add
この1行を除き、関数と同じコードです。
問題2:埋め込み形式では、一部のajax関数が機能しませんでした。たとえば、無制限の値を持つフィールドがあり、「別のアイテムを追加」ボタンがある場合、またはフォームにファイルのアップロードフィールドがある場合、それらは機能しません。
回避策2:カスタムモジュールで、hook_menu_alter()
ajax呼び出しパスを実装し、includeします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';
}