Подтвердить что ты не робот

Drupal 7 - Как отобразить форму node/add/sometype на другой странице?

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

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

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

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

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

4b9b3361

Ответ 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;
}