Membuat Node dan Node yang direferensikan pada Saat yang Sama

7

Saya memiliki situasi di mana saya ingin dapat membuat node dan referensi node pada saat yang sama. Apakah ada solusi untuk ini yang bekerja dengan baik untuk ini?

Untuk memperjelas apa yang saya bicarakan, pertimbangkan situasi berikut ( sangat disederhanakan demi penjelasan):

Ada kelas tipe konten yang memiliki bidang referensi simpul, Siswa . Saya ingin agar pengguna dapat membuat simpul Kelas dan simpul Siswa pada saat yang sama. Saya juga ingin mereka dapat menggunakan referensi simpul normal otomatis untuk memilih seorang Siswa yang kebetulan sudah ada.

Idealnya, saya ingin semua ini bekerja dari satu halaman, dan juga bekerja dalam batas-batas sistem izin Drupal sehingga saya dapat memiliki berbagai peran dan berbagai izin.

Ya, saya tahu bahwa dalam hal ini Siswa akan lebih baik dilayani sebagai pengguna (daripada simpul), tetapi Kelas dan Siswa hanya untuk menggambarkan situasi. Skenario sebenarnya benar-benar membutuhkan referensi simpul.

Ada pertanyaan yang mirip dengan ini, Membuat node yang direferensikan bersama-sama dengan node induk , tetapi saya secara khusus tertarik pada solusi Drupal 7 saja.

EDIT:

Tidak hanya mencari modul yang ada, tetapi juga memulai kode kustom.

mpdonadio
sumber
Di Drupal 7, saya telah menulis beberapa kode khusus untuk melakukan ini untuk situs saya, hanya karena belum ada solusi berbasis modul yang dapat saya pikirkan. Anda bahkan bisa melempar formulir untuk membuat simpul siswa ke dalam modal ctools, lalu meneruskan kembali nid ke bentuk simpul asli menggunakan ajax_command_data () atau fungsi lain-ajax-data-passing.
geerlingguy
@geerlingguy, jika Anda menuliskannya sebagai jawaban (khususnya memulai untuk modul AJAX dan passback nid), itu akan dianggap serius sebagai jawaban.
mpdonadio
Akan lakukan sedikit.
geerlingguy

Jawaban:

4

Saya menggunakan dialog Referensi , yang menempatkan "+" kecil pada bidang referensi yang ada yang memungkinkan pengguna untuk membuat siswa baru langsung dari formulir edit simpul kelas .

Pelajaran
sumber
Adakah yang menggunakan modul ini? Saya ingin mendengar umpan balik tentang rilis alpha.
David John Smith
FYI Baru saja menginstal modul ini dan sepertinya cocok.
David John Smith
8

Untuk beberapa situs berbeda sekarang, saya telah melakukan ini menggunakan modal ctools, dan inilah garis besar dasar bagaimana saya mengimplementasikannya (sangat sederhana):

  • Buat panggilan balik halaman khusus di hook_menu () modul Anda yang menampilkan bentuk simpul dasar untuk simpul yang ingin Anda rujuk (untuk simpul 'pelajar', cukup isi bidang nama dan mungkin bidang tahun kelulusan). Pada formulir itu, di dalam panggilan balik Anda, simpan simpul menggunakan node_save () , dan simpan ID simpul (yang seharusnya berada di $ node-> nid setelah Anda meneruskan objek simpul baru ke node_save ()) di formulir itu $form_state['storage']['student_id'].

  • Ubah bentuk master / Class node menggunakan hook_form_alter () . Anda perlu melakukan beberapa hal di sini:

Pertama, Anda perlu menambahkan javascript dan fungsi modal ctools agar ctool tahu apa yang harus dilakukan dengan tautan khusus Anda:

// Add in ctools modal js and functionality.
ctools_include('modal');
ctools_modal_add_js();

Kedua, Anda perlu menambahkan tautan ke halaman panggilan balik yang Anda buat pada langkah 1 di menu kait, dan dengan tautan itu, tambahkan kelas 'ctools-use-modal'. Jadi, misalnya:

// Add link to custom student form callback with ctools modal.
$form['add_student_link'] = array(
  '#markup' => l(t('Add Student'), 'mymodule/add-student', array('attributes' => array('class' => array('ctools-use-modal')))
);
  • Di panggilan balik halaman khusus Anda, Anda perlu melakukan beberapa hal untuk membuatnya berfungsi dengan atau tanpa JavaScript, dan dengan fungsi formulir ctools.

Berikut ini contoh panggilan balik:

<?php
function mymodule_student_form_callback($js = FALSE) {
  // Make sure $js (set by ctools) is TRUE/loaded.
  if ($js) {
    // Add in ctools modal form stuff.
    ctools_include('modal');
    ctools_include('ajax');
    $form_state = array(
      'ajax' => TRUE,
      'title' => t('Create a Student'),
    );

    $output = ctools_modal_form_wrapper('mymodule_create_student_form', $form_state);
  }
  else {
    return 'Javascript must be enabled for this feature to work.';
    // Or, if we wanted to load the form normally...
    // return drupal_get_form('mymodule_create_student_form');
  }

  // If the form is executed, dismiss the form and reload the page.
  if ($form_state['executed']) {      
    $commands = array();

    // Close the frame.
    $commands[] = ctools_modal_command_dismiss();

    // Use one of the ajax framework commands to place the returned
    // student node nid into the proper form value, placholder div, etc.
    // See: http://api.drupal.org/api/drupal/includes%21ajax.inc/group/ajax_commands/7
    $commands[] = ajax_command_append('#student-id-placeholder', $form_state['storage']['student_id']);

    $output = $commands;
  }

  // Render the output.
  print ajax_render($output);
  exit();
}
?>
  • Di mymodule_create_student_form($form, $form_state), buat formulir Anda seperti biasanya, dan kemudian dalam fungsi mymodule_create_student_form_submit(form, &$form_state)(kirim), setel nilai NID simpul siswa yang baru dibuat di $form_state['storage']['student_id']. Ini adalah bagaimana Anda akan mendapatkan ctools / AJAX untuk mengembalikan nid baru ke bentuk Kelas asli Anda.

  • Dalam situasi saya, saya menggunakan modal untuk meludah kembali beberapa markup ke halaman asli, jadi saya melewati markup ke dalam placeholder div menggunakan ajax_command_append(), kemudian saya punya beberapa jQuery di halaman asli memonitor div placeholder, dan ketika menemukan konten di itu, itu akan memindahkan HTML ke tempat yang tepat di tempat lain pada bentuk simpul. Dalam kasus Anda, Anda harus mengisi bidang referensi simpul tunggal atau multi-nilai, yang mungkin sedikit lebih kompleks. Saya belum perlu melakukan itu ... jadi saya tidak punya saran lagi untuk ditawarkan untuk bagian dari persamaan.

geerlingguy
sumber
4

Opsi mungkin untuk menambahkan dukungan simpul ke modul Formulir Entitas Inline .

EDIT: Formulir Entitas Inline memiliki dukungan simpul saat ini.

Bojan Zivanovic
sumber
2

Modul berikut dapat digunakan di Drupal 7:

  1. https://drupal.org/project/noderefcreate
  2. https://drupal.org/project/nodeconnect
  3. https://drupal.org/project/entityconnect
  4. https://drupal.org/project/inline_entity_form

Noderefcreate hanya membuat simpul baru jika tidak ada dengan menggunakan wisaya autocomplete. Nodeconnect dan entitasconnect menyediakan tombol add / edit pada referensi node, jika wizard autocomplete digunakan. Nodeconnect hanya menyediakannya untuk referensi simpul sedangkan entitasconnect menyediakannya untuk referensi simpul, referensi entitas, referensi istilah dan referensi pengguna.

Inline_entity_form menyediakan dua widget tambahan untuk referensi entitas (hanya).

sumanchalki
sumber
0

Jika ini benar-benar mirip dengan skenario Sekolah dan Siswa Anda dapat bergabung dengan beberapa Kelas yang akan saya gunakan:

  • 3 jenis konten: Siswa (* -1) Kehadiran (1- *) Kelas
  • Formulir Blok untuk memasukkan data Siswa langsung di blok;
  • Bidang Tampilan untuk menampilkan tampilan dengan daftar Siswa yang menghadiri Kelas;

Ini juga akan memerlukan menggunakan Token , memfilter tampilan tergantung pada Kelas nid dan menyiapkan nilai default untuk bidang referensi simpul Kehadiran sebagai Kelas nid saat ini.

Akhirnya Anda bisa memetakan jenis konten Siswa Anda ke Pengguna dengan referensi pengguna.

Refineo
sumber
Jenis konten saya sudah ada dan situs berfungsi. Menambahkan jenis perantara akan membutuhkan banyak pengerjaan ulang.
mpdonadio