Вставить форму «Добавить узел» на странице


19

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


1
Если у вас есть конкретные проблемы с блочной формой, лучшим местом для поиска может быть очередь проблем для этого модуля.
Джереми Френч

Ответы:


28

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

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

3
Если вы получите ошибку, которая node_add()не определена, вы захотите добавить ее if (!function_exists('node_add')) { module_load_include('inc', 'node', 'node.pages'); }в начале. Эта информация поступает отсюда: ( kahthong.com/2012/01/embed-drupal-node-form-anywhere )
mbrakken

Есть ли способ поместить это в блок? Или это должно быть включено в файл tpl.php?

Я не могу использовать код для формы с элементами Ajax (например: загрузка файла). Возможное решение
Диметрия

@Dimetry см. Мой ответ на использование элементов Ajax во встроенной форме узла.
Елин Й.

16

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

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';
}

Будет ли Inline Entityform альтернативой? Я поиграл с модулем, но не смог отобразить форму добавления узла на внешнем интерфейсе, только когда вы редактируете узел, вы можете предоставить поле entityreference, которое отображает форму добавления узла.
AlxVallejo

1
Inline Entityform предназначен для справочных полей объекта, что не имеет значения для этого вопроса.
Елин Й.

1
Если вы не хотите использовать hook_menu_alter () для загрузки файлов и т. Д., Вместо этого вы можете добавить включение в форму для изменения формы узла: function YOURMODULE_form_NODETYPE_node_form_alter(&$form, &$form_state) { form_load_include($form_state, 'inc', 'node', 'node.pages'); }
joe_flash

@ ЕлинЙ. Относится ли ваш ответ к этому вопросу ?
Umair

1
@ Umair Мой ответ только о добавлении формы узла на страницу. Он не будет отправлять форму через AJAX и не будет обновлять представление. Тем не менее, вы можете достичь тех, кто использует AJAX Framework .
Елин Й.

0

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

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;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.