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