Вставьте форму "добавление узла" на страницу
Я ищу способ встроить форму "добавление узла" на целевую страницу. Я использовал Блок формы , но, похоже, он вызывает много ошибок, потому что я использовал версию моментального снимка разработки.
3 answers
Вы можете использовать:
module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
Хотя ответ Дэниела Венера абсолютно правильный и работает, я хотел добавить две общие проблемы, с которыми я столкнулся при таком подходе, и обходные пути, как я преодолеваю эти проблемы. Сначала мой код, затем пояснения:
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';
}
Если я использую код принятого ответа...
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;