Я ищу способ встроить форму "добавление узла" на целевую страницу. Я использовал Form Block , но он, кажется, приносит много ошибок, потому что я использовал версию снимка разработки.
Я ищу способ встроить форму "добавление узла" на целевую страницу. Я использовал Form Block , но он, кажется, приносит много ошибок, потому что я использовал версию снимка разработки.
Ответы:
Ты можешь использовать:
module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
node_add()
не определена, вы захотите добавить ее if (!function_exists('node_add')) { module_load_include('inc', 'node', 'node.pages'); }
в начале. Эта информация поступает отсюда: ( kahthong.com/2012/01/embed-drupal-node-form-anywhere )
Хотя ответ Даниэля Венера абсолютно верен и работает, я хотел добавить две общие проблемы, с которыми я столкнулся при таком подходе, и способы обхода этих проблем. Сначала мой код, затем объяснения:
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)
Почему я сделал это так, а не просто Даниилом node_add
?
Проблема 1: node_add()
функция изменяет заголовок страницы на Создать «тип узла» , это жестко закодировано в функции.
Обходной путь 1: вместо использования node_add
функции я скопировал код и удалил drupal_set_title
. Приведенный выше код совпадает с кодом node_add
функции, за исключением этой строки.
Проблема 2: во встроенной форме некоторые функции ajax не работали. Например, если у вас есть поле, которое может иметь неограниченные значения, так что у вас есть кнопка «Добавить другой элемент», или если у вас есть поле для загрузки файла в форме, они не работают.
Обходной hook_menu_alter()
путь 2: В своем пользовательском модуле внедрите пути вызова 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';
}
function YOURMODULE_form_NODETYPE_node_form_alter(&$form, &$form_state) { form_load_include($form_state, 'inc', 'node', 'node.pages'); }
Если я использую принятый код ответа ...
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;