Как отобразить форму узла / добавления / некоторого типа на другой странице? - PullRequest
33 голосов
/ 17 марта 2011

Вся проблема в следующем:

Допустим, у нас есть предметы, у предметов могут быть ставки, у предметов могут быть вопросы, а у вопросов может быть ответ.

Когда отображается элемент, все содержимое, связанное с этим элементом, также должно отображаться. Кроме того, в зависимости от ролей должны отображаться определенные формы для подачи заявок, задавания вопросов и воспроизведения ответов.

Как этого добиться? Должен ли я иметь отдельный тип узла для каждого типа? Или я должен рассматривать некоторые подтипы как Вопросы и Ответы как комментарии? Должен ли я использовать некоторые известные модули для этого?

Я использую Drupal 7, и я пытался написать собственный модуль, но у меня он не работал должным образом.

Ответы [ 9 ]

35 голосов
/ 12 октября 2011
module_load_include('inc', 'node', 'node.pages');

$form = node_add('nodetype');
$output = drupal_render($form);

Если в вашей форме узла есть виджет выгрузки файлов, вы должны добавить следующие строки в массив меню:

'file path' => drupal_get_path('module', 'node'),
'file' => 'node.pages.inc',
20 голосов
/ 18 марта 2011

Чтобы получить форму редактирования узла, вам нужно включить 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);
?>
5 голосов
/ 18 октября 2012
// 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 голосов
/ 18 марта 2011

Модуль Блок формы - это самый простой способ встроить форму узла на страницу. Затем я использовал бы представления с отображением блока и аргументом, чтобы показать табличный список этих связанных узлов.

Несмотря на то, что модуль комментариев Drupal 7 построен на полях, он на самом деле недостаточно гибок для вещей, не связанных с комментариями. Если вы хотите, чтобы у вашего подтипа были заголовок и тело, то, вероятно, лучше всего использовать комментарии. Если вам нужны только настраиваемые поля, то есть путь к узлу, и, возможно, используйте что-то вроде Automatic Nodetitles .

Обновление для 2014: если кто-то предпочитает добавить блок без кодировки, вы можете попробовать модуль Advanced Form Block , который добавляет несколько функций в ваши стандартные блоки (вы можете добавить до вы хотите, чтобы все они отправляли через AJAX и даже выбирали, какие поля вы хотите). В отличие от модуля Form Block, он все еще активно поддерживается для Drupal 7.

2 голосов
/ 23 апреля 2011

Ответ Томаса выглядит хорошо для меня: Formblocks и, возможно, автоматические названия узлов. Я думаю, вы могли бы расширить это с помощью Nodereference URL Widget - используя ссылки на узлы, а не комментарии, и позволяя этому модулю поддерживать работу дочерних узлов со своим родителем.

2 голосов
/ 16 апреля 2011

В Drupal 7 пустой узел должен быть создан как объект (не массив).

  $node->uid = $user->uid;
  $node->name = (isset($user->name) ? $user->name : '');
  $node->type = $node_type;
  $node->language = '';
1 голос
/ 27 апреля 2016

Вот как я решил проблему:

В моем 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;
}
1 голос
/ 16 января 2016

Я воспроизводлю решение, которое сработало для меня в моем случае.он доступен в качестве ответа на 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 формой узла или формой пользователя.

1 голос
/ 11 сентября 2012

Чтобы пример dobeerman (принятый ответ) работал в d7, добавьте 'language' => LANGUAGE_NONE и приведите массив $ node в объект.т.е.:

$node = (object)array(
  'uid' => $user->uid,
  'name' => (isset($user->name) ? $user->name : ''),
  'type' => $node_type,
  'language' => LANGUAGE_NONE
);
...