Đố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.