Drupal 7 - Как отобразить форму node/add/sometype на другой странице?
Вся проблема в следующем:
Давайте скажем, что у нас есть элементы, у предметов могут быть предложения, у предметов могут быть вопросы, и вопрос может иметь ответ.
Когда отображается элемент, все изображения, связанные с этим элементом, также должны отображаться. Кроме того, в зависимости от ролей должны отображаться определенные формы для составления ставок, задавать вопросы и повторять ответы.
Как достичь этого? Должен ли я иметь отдельный тип node для каждого типа? Или я должен рассматривать некоторые подтипы, такие как "Вопросы и ответы" в качестве комментариев? Должен ли я использовать для этого некоторые известные модули?
Я использую Drupal 7, и я попытался написать настраиваемый модуль, но я не получил его правильно.
Ответы
Ответ 1
Чтобы получить форму редактирования node, вам нужно включить node.pages.inc.
<?php
// required for Drupal 6
module_load_include('inc', 'node', 'node.pages');
// which nodeform you want
$node_type = 'YOURNODETYPE';
$form_id = $node_type . '_node_form';
// maybe add current users info
global $user;
// create a blank node
$node = array(
'uid' => $user->uid,
'name' => (isset($user->name) ? $user->name : ''),
'type' => $node_type,
);
// Invoke hook_nodapi and hook_node
node_object_prepare($node);
// Or you can also use an exiting node, for example
// $node = node_load(123);
// and the display the form:
$output = drupal_get_form($form_id, $node);
?>
Ответ 2
module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
$output = drupal_render($form);
Если ваша форма node имеет виджет загрузки файлов, вы должны добавить следующие строки в массив меню:
'file path' => drupal_get_path('module', 'node'),
'file' => 'node.pages.inc',
Ответ 3
// Drupal 7
// Embed node creation form on a custom page inside module.
module_load_include('inc', 'node', 'node.pages');
$form = node_add('node_machine_name');
return drupal_render($form);
Ответ 4
Модуль Блок форм - это самый простой способ встраивания формы node на страницу. Затем я бы использовал представления с отображением блоков и аргумент, чтобы показать табличный список этих связанных узлов.
Несмотря на то, что модуль комментариев Drupal 7 построен на полях, он действительно недостаточно гибкий для подобных комментариев. Если вы хотите, чтобы ваш подтип имел название и тело, тогда комментарии, вероятно, подходят. Если вам нужны только пользовательские поля, то node - это способ пойти и, возможно, использовать что-то вроде Automatic Nodetitles.
Обновление на 2014 год. Если добавить блок без кодирования, то предпочтительнее любого, кого вы можете захотеть проверить модуль расширенного форматa > , который добавляет несколько функций к вашим стандартным блокам (вы можете добавить столько, сколько хотите, сделать их все через AJAX и даже выбрать, какие поля вы хотите). В отличие от модуля Form Block, он по-прежнему активно поддерживается для Drupal 7.
Ответ 5
В Drupal 7 пустой node должен быть создан как объект (а не массив).
$node->uid = $user->uid;
$node->name = (isset($user->name) ? $user->name : '');
$node->type = $node_type;
$node->language = '';
Ответ 6
Ответ Тома выглядит хорошо для меня: Formblocks и, возможно, автоматические nodetitles. Я думаю, вы могли бы расширить это с помощью Виджета URL-адреса с нумерацией - с помощью нодерементов, а не комментариев, и позволяя этому модулю выполнять работу по хранению дочерних узлов связанные с их родителями.
Ответ 7
Чтобы получить пример dobeerman (принятый ответ) для работы в d7, добавьте 'language' = > LANGUAGE_NONE и введите массив $ node в объект. то есть:.
$node = (object)array(
'uid' => $user->uid,
'name' => (isset($user->name) ? $user->name : ''),
'type' => $node_type,
'language' => LANGUAGE_NONE
);
Ответ 8
Я воспроизвожу решение, которое работало на меня по моему делу. он доступен в качестве ответа на Drupal.org, и это может помочь другим людям с той же проблемой, с которой я столкнулся.
Ответ можно найти здесь: https://www.drupal.org/node/1336212#comment-6192404.
Я копирую-вставляю его ниже:
в вашем пользовательском обратном вызове ИЛИ в hook_form_alter, вызовите либо...
<?php
form_load_include($form_state, 'inc', 'node', 'node.pages');
?>
... ИЛИ...
<?php
form_load_include($form_state, 'inc', 'user', 'user.pages');
?>
... в зависимости от того, является ли базовая форма Drupal, которую вы загружаете, является формой node или пользовательской формой.
Ответ 9
Вот как я решил проблему:
В моем hook_menu
$items['add-visiteur'] = array(
'title' => 'Add',
'page callback' => 'add_visiteur',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
и моя функция обратного вызова
function add_visiteur() {
module_load_include('inc', 'node', 'node.pages');
// which nodeform you want
$node_type = 'visiteur';
$form_id = $node_type . '_node_form';
// maybe add current users info
global $user;
// create a blank node
$node = new stdClass;
$node->uid = $user->uid;
$node->name = (isset($user->name) ? $user->name : '');
$node->type = $node_type;
// Invoke hook_nodapi and hook_node
node_object_prepare($node);
$output = drupal_get_form($form_id, $node);
return $output;
}