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


19

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


1
フォームブロックに特定の問題がある場合は、そのモジュールの問題キューが最適な場所である可能性があります。
ジェレミーフランス語

回答:


28

次を使用できます。

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

3
node_add()未定義のエラーが発生した場合はif (!function_exists('node_add')) { module_load_include('inc', 'node', 'node.pages'); }、最初に追加することをお勧めします。この情報はここから来ています:(kahthong.com/2012/01/embed-drupal-node-form-anywhere
mbrakken

これをブロックに入れる方法はありますか?または、これをtpl.phpファイルに含める必要がありますか?

Ajax要素を含むフォームにコードを使用することはできません(たとえば、ファイルのアップロード)。考えられる解決策
-Dimetry

@Dimetryは埋め込みノードフォームでAjax要素を使用するための私の答えを参照しください。
ЕлинЙ.

16

ダニエルウェーナーの答えは完全に正しいものですが、このアプローチで直面した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';
}

Inline Entityformは代替手段になりますか?モジュールで遊んでいますが、フロントエンドでノード追加フォームを表示できません。ノードを編集するときのみ、ノード追加フォームを表示するエンティティ参照フィールドを提供できます。
AlxVallejo

1
インラインEntityformはエンティティ参照フィールド用であり、この質問には関係ありません。
ЕлинЙ.

1
ファイルのアップロードなどにhook_menu_alter()を使用したくない場合は、代わりにノードフォームのalterにincludeを追加できます function YOURMODULE_form_NODETYPE_node_form_alter(&$form, &$form_state) { form_load_include($form_state, 'inc', 'node', 'node.pages'); }
。– joe_flash

@ЕлинЙ。あなたの答えはこの質問に当てはまりますか?
Umair

1
@Umair私の答えは、ノードフォームをページに追加することだけです。AJAX経由でフォームを送信することも、ビューを更新することもありません。ただし、AJAX Frameworkを使用してこれらを実現できます
ЕлинЙ.

0

受け入れられた回答のコードを使用する場合...

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;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.