it-swarm-vi.com

Nhúng biểu mẫu "nút thêm" vào trang

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 Biểu mẫu khối , 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.

18
ousneo

Bạn có thể dùng:

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

Mặc dù câu trả lời của Daniel Wehner hoàn toàn chính xác và hoạt động, 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à 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' , điều này khó được mã hóa trong hàm.

Giải pháp thay thế 1: Thay vì sử dụng chức năng node_add, Tôi đã sao chép mã và xóa drupal_set_title. Mã ở trên là cùng mã với hàm node_add, 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 đườ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';
}
16
Елин Й.

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

module_load_include('inc', 'node', 'node.pages');
$form = node_add('program_registration');
return $form;
0
alec