Tạo các nút và nút tham chiếu cùng một lúc


7

Tôi có một tình huống mà tôi muốn có thể tạo các nút và các nút được tham chiếu cùng một lúc. Có giải pháp nào cho việc này hoạt động tốt cho việc này không?

Để làm rõ những gì tôi đang nói, hãy xem xét tình huống sau ( rất đơn giản để giải thích):

Có một lớp loại nội dung có trường tham chiếu nút, Student . Tôi muốn người dùng có thể tạo các nút Lớp và nút Sinh viên cùng một lúc. Tôi cũng muốn họ có thể sử dụng tự động hoàn thành tham chiếu nút bình thường để chọn một Sinh viên đã tồn tại.

Lý tưởng nhất, tôi muốn tất cả những thứ này hoạt động từ một trang duy nhất và cũng hoạt động trong giới hạn của hệ thống cấp phép Drupal để tôi có thể có nhiều vai trò và quyền khác nhau.

Vâng, tôi biết rằng trong trường hợp này Sinh viên sẽ được phục vụ tốt nhất với tư cách là người dùng (chứ không phải là một nút), nhưng LớpSinh viên chỉ để minh họa tình huống. Kịch bản thực sự thực sự cần tham chiếu nút.

Có một câu hỏi tương tự như vậy, Tạo các nút được tham chiếu cùng với nút cha , nhưng tôi đặc biệt quan tâm đến các giải pháp Drupal 7.

BIÊN TẬP:

Không chỉ tìm kiếm các mô-đun hiện có, mà còn bắt đầu cho mã tùy chỉnh.


Trong Drupal 7, tôi đã viết một số mã tùy chỉnh để thực hiện điều này cho các trang web của mình, đơn giản vì chưa có giải pháp dựa trên mô-đun nào mà tôi có thể nghĩ ra. Bạn thậm chí có thể ném một biểu mẫu để tạo nút sinh viên vào phương thức ctools, sau đó chuyển lại nid về dạng nút ban đầu bằng cách sử dụng ajax_command_data () hoặc một hàm truyền dữ liệu ajax khác.
ge Muffguy

@ge Muffguy, nếu bạn viết nó lên như một câu trả lời (đặc biệt là sự khởi đầu cho mô-đun AJAX nid passback), nó sẽ được coi là một câu trả lời nghiêm túc.
mpdon Arena

Sẽ làm trong một chút.
geummingguy

Câu trả lời:


4

Tôi sử dụng hộp thoại Tài liệu tham khảo , đặt một "+" nhỏ trên các trường tham chiếu hiện có cho phép người dùng tạo một sinh viên mới trực tiếp từ biểu mẫu chỉnh sửa nút lớp .


Có ai đã sử dụng mô-đun này? Tôi muốn nghe một số phản hồi về các bản phát hành alpha.
David John Smith

FYI Chỉ cần cài đặt mô-đun này và nó có vẻ phù hợp hoàn hảo.
David John Smith

8

Đối với một vài trang web khác nhau bây giờ, tôi đã thực hiện điều này bằng cách sử dụng phương thức ctools và đây là phác thảo cơ bản về cách tôi đã triển khai nó (rất đơn giản):

  • Tạo một cuộc gọi lại trang tùy chỉnh trong hook_menu () của mô-đun của bạn để hiển thị một dạng nút cơ bản cho nút mà bạn muốn tham chiếu (đối với nút 'sinh viên', chỉ cần có trường tên và có thể là trường năm tốt nghiệp). Trên biểu mẫu đó, trong cuộc gọi lại gửi của bạn, hãy lưu nút bằng cách sử dụng node_save () và lưu trữ ID nút (phải ở $ node-> nid sau khi bạn chuyển một đối tượng nút mới cho node_save ()) trong biểu mẫu $form_state['storage']['student_id'].

  • Thay đổi hình thức nút master / Class bằng hook_form_alter () . Bạn cần làm một vài điều ở đây:

Trước tiên, bạn cần thêm vào javascript phương thức và chức năng của ctools để ctools biết phải làm gì với liên kết đặc biệt của bạn:

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

Thứ hai, bạn cần thêm một liên kết đến cuộc gọi lại trang mà bạn đã tạo ở bước 1 trong menu hook và với liên kết đó, hãy thêm lớp 'ctools-use-modal'. Ví dụ:

// 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')))
);
  • Trong cuộc gọi lại trang tùy chỉnh của bạn, bạn cần thực hiện một số điều để làm cho nó hoạt động có hoặc không có JavaScript và với các hàm biểu mẫu của ctools.

Đây là một ví dụ gọi lại:

<?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();
}
?>
  • Trong mymodule_create_student_form($form, $form_state), xây dựng biểu mẫu của bạn như bình thường, và sau đó trong hàm mymodule_create_student_form_submit(form, &$form_state)(submit), đặt giá trị NID của nút sinh viên mới được tạo trong $form_state['storage']['student_id']. Đây là cách bạn sẽ nhận được ctools / AJAX để trả lại nid mới cho biểu mẫu Lớp ban đầu của bạn.

  • Trong tình huống của tôi, tôi đã sử dụng phương thức để nhổ lại một số đánh dấu vào trang gốc, vì vậy tôi đã chuyển đánh dấu vào div giữ chỗ bằng cách sử dụng ajax_command_append(), sau đó tôi có một số jQuery trên trang gốc theo dõi div giữ chỗ và khi nó tìm thấy nội dung trong nó, nó sẽ di chuyển HTML vào vị trí thích hợp ở nơi khác trên biểu mẫu nút. Trong trường hợp của bạn, bạn sẽ cần phải điền vào một trường tham chiếu nút đơn hoặc đa giá trị, có thể phức tạp hơn một chút. Tôi chưa cần phải làm điều đó ... vì vậy tôi không có thêm lời khuyên nào để đưa ra phần đó của phương trình.



2

Các mô-đun sau có thể được sử dụng trong 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 chỉ tạo nút mới nếu nó không tồn tại bằng cách sử dụng trình hướng dẫn tự động hoàn thành. Nodeconnect và entityconnect cung cấp nút thêm / chỉnh sửa tại tham chiếu nút, nếu sử dụng thuật sĩ tự động hoàn thành. Nodeconnect chỉ cung cấp nó cho tham chiếu nút trong khi thực thể kết nối cung cấp nó cho tham chiếu nút, tham chiếu thực thể, tham chiếu thuật ngữ và tham chiếu người dùng.

Inline_entity_form cung cấp hai tiện ích bổ sung cho tham chiếu thực thể (chỉ).


0

Nếu điều này thực sự giống với kịch bản của Trường và Học sinh của bạn có thể tham gia nhiều Lớp tôi sẽ sử dụng:

  • 3 loại nội dung: Student (* -1) tham dự (1- *) Lớp
  • Biểu mẫu Khối để nhập dữ liệu Sinh viên trực tiếp trong một khối;
  • Trường xem để hiển thị chế độ xem với danh sách Học sinh tham gia Lớp học;

Điều này cũng sẽ yêu cầu sử dụng Token , lọc chế độ xem tùy thuộc vào Class nid và thiết lập giá trị mặc định cho trường tham chiếu nút Tham dự như là nid Class hiện tại.

Cuối cùng, bạn có thể ánh xạ loại nội dung Sinh viên của mình tới Người dùng với tham chiếu người dùng.


Các loại nội dung của tôi đã tồn tại và trang web hoạt động. Thêm một loại trung gian sẽ đòi hỏi rất nhiều làm lại.
mpdon Arena
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.