Вставьте форму "добавление узла" на страницу


Я ищу способ встроить форму "добавление узла" на целевую страницу. Я использовал Блок формы , но, похоже, он вызывает много ошибок, потому что я использовал версию моментального снимка разработки.

Author: ousneo, 2011-05-10

3 answers

Вы можете использовать:

module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
 29
Author: Daniel Wehner, 2014-10-29 11:34:54

Хотя ответ Дэниела Венера абсолютно правильный и работает, я хотел добавить две общие проблемы, с которыми я столкнулся при таком подходе, и обходные пути, как я преодолеваю эти проблемы. Сначала мой код, затем пояснения:

global $user;

module_load_include('inc', 'node', 'node.pages');

$node = (object) [
  '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)

Почему я сделал это таким образом, вместо простого Дэниела node_add?

Проблема 1: node_add() функция изменяет заголовок страницы на Создать "тип узла", это жестко задано в функции.

Обходной путь 1: Вместо того, чтобы использовать функцию node_add, я скопировал код и удалил drupal_set_title. Приведенный выше код является тем же кодом, что и функция node_add, за исключением этой строки.

Проблема 2: Во встроенной форме некоторые функции ajax не работали. Например, если у вас есть поле, которое может иметь неограниченное количество значений, так что у вас есть кнопка "Добавить другой элемент", или если у вас есть поле "Загрузить файл" в вашей форме, они не работают.

Обходной путь 2: В вашем пользовательском модуле реализуйте hook_menu_alter() для пути вызова ajax и включают 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';
}
 17
Author: Елин Й., 2020-04-30 09:03:08

Если я использую код принятого ответа...

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

...внутри функции обратного вызова страницы, затем print drupal_render.. это приводит к совершенно не тематической (сломанной) странице.

Поэтому вместо этого я просто return отредактировал $form:

module_load_include('inc', 'node', 'node.pages');
$form = node_add('program_registration');
return $form;
 0
Author: alec, 2017-08-26 01:29:16