Вставить форму «нет данных» на странице

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

19 голосов | спросил ousneo 10 Maypm11 2011, 13:42:12

3 ответа


28

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

module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
ответил Daniel Wehner 11 Mayam11 2011, 11:14:32
17

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

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 не работали. Например, если у вас есть поле, которое может иметь неограниченные значения, так что у вас есть кнопка «Добавить другой элемент» или если у вас есть поле для загрузки файлов в вашей форме, они не работают.

Обходной путь 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';
}
ответил Елин Й. 13 Jpm1000000pmMon, 13 Jan 2014 16:45:56 +040014 2014, 16:45:56
0

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

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

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

Поэтому вместо этого я просто return 'ed $form:

module_load_include('inc', 'node', 'node.pages');
$form = node_add('program_registration');
return $form;
ответил alec 26 AM00000040000001631 2017, 04:29:16

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132