Tôi đang tìm cách để nhúng biểu mẫu "thêm nút" vào trang đích. Tôi đã sử dụng Form Block , nhưng dường như có nhiều lỗi vì tôi đang sử dụng phiên bản chụp nhanh phát triển.
Tôi đang tìm cách để nhúng biểu mẫu "thêm nút" vào trang đích. Tôi đã sử dụng Form Block , nhưng dường như có nhiều lỗi vì tôi đang sử dụng phiên bản chụp nhanh phát triển.
Câu trả lời:
Bạn có thể dùng:
module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
node_add()
không xác định, bạn sẽ muốn thêm if (!function_exists('node_add')) { module_load_include('inc', 'node', 'node.pages'); }
vào lúc đầu. Thông tin này xuất phát từ đây: ( kahthong.com/2012/01/embed-drupal-node-form-anywhere )
Mặc dù câu trả lời của Daniel Wehner hoàn toàn chính xác và hiệu quả, tôi muốn thêm hai vấn đề phổ biến mà tôi gặp phải với cách tiếp cận này và cách giải quyết cách tôi khắc phục những vấn đề đó. Đầu tiên mã của tôi, sau đó là các giải thích:
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)
Tại sao tôi lại làm theo cách này, thay vì đơn giản của Daniel node_add
?
Vấn đề 1: node_add()
chức năng thay đổi tiêu đề trang thành Tạo 'loại nút' , đây là mã hóa cứng trong chức năng.
Giải pháp thay thế 1: Thay vì sử dụng node_add
chức năng, tôi đã sao chép mã và xóa drupal_set_title
. Mã trên là mã giống như node_add
hàm, ngoại trừ từ một dòng này.
Vấn đề 2: Ở dạng nhúng, một số hàm ajax không hoạt động. Ví dụ: nếu bạn có một trường có thể có các giá trị không giới hạn, để bạn có nút 'Thêm mục khác' hoặc nếu bạn có trường tệp tải lên trong biểu mẫu của mình, chúng không hoạt động.
Giải pháp 2: Trong mô-đun tùy chỉnh của bạn, triển khai hook_menu_alter()
cho các đường dẫn cuộc gọi ajax và bao gồm 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'); }
Nếu tôi sử dụng mã câu trả lời được chấp nhận ...
module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
... Bên trong chức năng gọi lại trang, sau đó print drupal_render..
điều này dẫn đến một trang hoàn toàn không có chủ đề (tìm kiếm bị hỏng).
Vì vậy, thay vào đó, tôi chỉ return
'ed $form
:
module_load_include('inc', 'node', 'node.pages');
$form = node_add('program_registration');
return $form;