Nhúng nút nút Thêm biểu mẫu vào trong một trang


19

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.


1
Nếu bạn đang gặp vấn đề cụ thể với khối biểu mẫu, nơi tốt nhất để tìm có thể là hàng đợi vấn đề cho mô-đun đó.
Jeremy Pháp

Câu trả lời:


28

Bạn có thể dùng:

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

3
Nếu bạn gặp một lỗi 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 )
mbrakken

Có cách nào để đặt cái này trong một khối không? Hoặc điều này phải được bao gồm trong tập tin tpl.php?

Tôi không thể sử dụng mã cho biểu mẫu với các phần tử Ajax (ví dụ: tải lên tệp). Giải pháp có thể
Kích thước

@Dimatures xem câu trả lời của tôi để sử dụng các phần tử Ajax trong một hình thức nút nhúng.
ЕЕннн

16

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_addchức năng, tôi đã sao chép mã và xóa drupal_set_title. Mã trên là mã giống như node_addhà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';
}

Inline Entityform sẽ là một sự thay thế? Tôi đã chơi xung quanh với mô-đun nhưng không thể hiển thị biểu mẫu thêm nút ở mặt trước, chỉ khi bạn chỉnh sửa nút, bạn mới có thể cung cấp trường thực thể hiển thị biểu mẫu thêm nút.
AlxVallejo

1
Inline Entityform dành cho các trường tham chiếu thực thể, không liên quan đến câu hỏi này.
ЕЕннн

1
Nếu bạn không muốn sử dụng hook_menu_alter () để tải lên tệp, v.v., bạn có thể thêm bao gồm trong một biểu mẫu thay đổi cho dạng nút thay thế: function YOURMODULE_form_NODETYPE_node_form_alter(&$form, &$form_state) { form_load_include($form_state, 'inc', 'node', 'node.pages'); }
joe_flash

@ ЕЕнн Câu trả lời của bạn có áp dụng cho câu hỏi này không?
Umair

1
@Umair Câu trả lời của tôi chỉ là về việc thêm một hình thức nút vào một trang. Nó sẽ không gửi biểu mẫu qua AJAX và cũng không cập nhật chế độ xem. Tuy nhiên, bạn có thể đạt được những người sử dụng AJAX Framework .
ЕЕннн

0

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;
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.