Saya mencari cara untuk menyematkan formulir "simpul tambahkan" pada halaman arahan. Saya menggunakan Formulir Blok , tetapi tampaknya membawa banyak kesalahan karena saya menggunakan versi snapshot pengembangan.
Saya mencari cara untuk menyematkan formulir "simpul tambahkan" pada halaman arahan. Saya menggunakan Formulir Blok , tetapi tampaknya membawa banyak kesalahan karena saya menggunakan versi snapshot pengembangan.
Jawaban:
Kamu bisa memakai:
module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
node_add()
tidak ditentukan, Anda ingin menambahkannya if (!function_exists('node_add')) { module_load_include('inc', 'node', 'node.pages'); }
di awal. Informasi ini datang dari sini: ( kahthong.com/2012/01/embed-drupal-node-form-anywhere )
Meskipun jawaban Daniel Wehner benar-benar tepat dan berfungsi, saya ingin menambahkan dua masalah umum yang saya hadapi dengan pendekatan ini dan mencari tahu bagaimana saya mengatasi masalah itu. Pertama kode saya, lalu penjelasannya:
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)
Kenapa aku melakukannya dengan cara ini, bukannya Daniel yang sederhana node_add
?
Masalah 1: node_add()
fungsi mengubah judul halaman menjadi Buat 'tipe simpul' , ini sulit dikodekan dalam fungsi.
Solusi 1: Alih-alih menggunakan node_add
fungsi, saya telah menyalin kode dan menghapus drupal_set_title
. Kode di atas adalah kode yang sama dengan node_add
fungsi, kecuali dari baris yang satu ini.
Masalah 2: Dalam formulir tertanam beberapa fungsi ajax tidak berfungsi. Misalnya jika Anda memiliki bidang yang dapat memiliki nilai tidak terbatas, sehingga Anda memiliki tombol 'Tambahkan item lain', atau jika Anda memiliki bidang file unggahan di formulir Anda, mereka tidak berfungsi.
Solusi 2: Dalam modul khusus Anda, terapkan hook_menu_alter()
untuk jalur panggilan ajax, dan sertakan 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';
}
function YOURMODULE_form_NODETYPE_node_form_alter(&$form, &$form_state) { form_load_include($form_state, 'inc', 'node', 'node.pages'); }
Jika saya menggunakan kode jawaban yang diterima ...
module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
... di dalam fungsi panggilan balik halaman, maka print drupal_render..
ini menghasilkan halaman yang sama sekali tidak bertema (tampak rusak).
Jadi sebagai gantinya, saya hanya return
mengedit $form
:
module_load_include('inc', 'node', 'node.pages');
$form = node_add('program_registration');
return $form;