Вставте форму "додавання вузла" на сторінку


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 не працювали. Наприклад, якщо у вас є поле, яке може мати необмежені значення, так що у вас є кнопка "Додати інший елемент", або якщо у вас є поле файлу для завантаження у формі, вони не працюють.

Обхід 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';
}

Чи була б альтернатива Inline Entityform? Я розігрувався з модулем, але не зміг відобразити форму додавання вузла на лицьовій стороні, лише коли ви редагуєте вузол, ви можете надати поле референції сутності, яке відображає форму додавання вузла.
AlxVallejo

1
Inline Entityform призначений для посилальних полів, що не має значення для цього питання.
Елін Й.

1
Якщо ви не хочете використовувати kuk_menu_alter () для завантаження файлів тощо, ви можете замість цього додати включити у форму змінити форму вузла: function YOURMODULE_form_NODETYPE_node_form_alter(&$form, &$form_state) { form_load_include($form_state, 'inc', 'node', 'node.pages'); }
joe_flash

@ ЕлінЙ. Чи стосується Вашої відповіді на це питання ?
Умаїр

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.