Sematkan formulir “node add” di halaman


19

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.


1
Jika Anda mengalami masalah khusus dengan blokir, tempat terbaik untuk melihat mungkin adalah antrian masalah untuk modul itu.
Jeremy French

Jawaban:


28

Kamu bisa memakai:

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

3
Jika Anda mendapatkan kesalahan yang 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 )
mbrakken

Ada cara untuk meletakkan ini di blok? Atau apakah ini harus dimasukkan dalam file tpl.php?

Saya tidak dapat menggunakan kode untuk formulir dengan elemen Ajax (misalnya: unggah file). Solusi yang mungkin
Dimetry

@Dimetry lihat jawaban saya untuk menggunakan elemen Ajax dalam bentuk simpul yang disematkan.
Елин Й.

16

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_addfungsi, saya telah menyalin kode dan menghapus drupal_set_title. Kode di atas adalah kode yang sama dengan node_addfungsi, 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';
}

Akankah Inline Entityform menjadi alternatif? Saya telah bermain-main dengan modul tetapi belum dapat menampilkan formulir tambah simpul di front-end, hanya ketika Anda mengedit sebuah simpul Anda dapat memberikan bidang referensi entitas yang menampilkan formulir tambah simpul.
AlxVallejo

1
Inline Entityform adalah untuk bidang referensi entitas, yang tidak relevan untuk pertanyaan ini.
Елин Й.

1
Jika Anda tidak ingin menggunakan hook_menu_alter () untuk mengunggah file, dll, Anda dapat menambahkan sertakan dalam form ubah untuk bentuk simpul sebagai gantinya: function YOURMODULE_form_NODETYPE_node_form_alter(&$form, &$form_state) { form_load_include($form_state, 'inc', 'node', 'node.pages'); }
joe_flash

@ ЕлинЙ. Apakah jawaban Anda berlaku untuk pertanyaan ini ?
Umair

1
@Umair Jawaban saya hanya tentang menambahkan bentuk simpul ke halaman. Itu tidak akan mengirimkan formulir melalui AJAX atau memperbarui tampilan. Namun, Anda dapat mencapainya menggunakan Kerangka AJAX .
Елин Й.

0

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 returnmengedit $form:

module_load_include('inc', 'node', 'node.pages');
$form = node_add('program_registration');
return $form;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.