Показ узла редактирует страницу с drupal_get_form () и hook_menu ()

Я использую drupal 7 и застреваю в очень простой проблеме. Я хотел бы просто показать страницу редактирования известному идентификатору узла. Я знаю, что существуют подобные сообщения, но они или не работали, или я не понял тему. Мой модуль похож на это:

<?php
/*
 * Show the edid page to a specific nid.
 */

function control_center_menu() {
  $items = array();
  module_load_include('inc', 'node', 'node.pages');
  $nid = '4';
  $node = node_load($nid);
  $items['test/test'] = array(
    'title' => 'Edit this node',
    'description' => 'Edit this node.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('page_node_form', $node),
    'access callback' => TRUE,
  );
  return $items;
}

Однако в тесте/тесте я получаю набор ошибок:

Warning: call_user_func_array() expects parameter 1 to be a valid callback, function 'node_form' not found or invalid function name in drupal_retrieve_form() (line 795 of /home/christian/workspace/gigs/includes/form.inc).
Notice: Undefined index: #node in menu_form_node_form_alter() (line 629 of /home/christian/workspace/gigs/modules/menu/menu.module).
Notice: Trying to get property of non-object in menu_form_node_form_alter() (line 629 of /home/christian/workspace/gigs/modules/menu/menu.module).
Notice: Undefined index: #node in menu_form_node_form_alter() (line 630 of /home/christian/workspace/gigs/modules/menu/menu.module).
Notice: Trying to get property of non-object in menu_form_node_form_alter() (line 630 of /home/christian/workspace/gigs/modules/menu/menu.module).

И вместо дыры формируются, я только получаю флажок Настройки меню и настройки пути URL.

Что я делаю неправильно? Я очень старался найти новичка дружественной копией прошлый пример, но не нашел никого... Большое спасибо заранее!

6
06.01.2020, 14:55
2 ответа

hook_menu() только оценен, когда кэши восстановлены, таким образом, вызов к module_load_include() не будет назван, когда путь на самом деле посетят.

Тот рычаг только предназначен для объявления пунктов меню, если существует какая-либо логика, которая должна быть добавлена для пути, как который это должно произойти в обратном вызове обратного вызова/страница доступа так:

function control_center_menu() {
  $items = array();

  $items['test/test'] = array(
    'title' => 'Edit this node',
    'description' => 'Edit this node.',
    'page callback' => 'control_center_test_callback',
    'page arguments' => array('page_node_form', $node),
    'access callback' => TRUE,
  );
  return $items;
}

function control_center_test_callback() {
  module_load_include('inc', 'node', 'node.pages');
  $nid = '4';
  $node = node_load($nid);

  return drupal_get_form('page_node_form', $node);
}

Так как Вы передаете статической странице редактирования узла, хотя, могло бы быть легче только установить обратный вызов страницы на drupal_goto() и hardcode URL:

function control_center_menu() {
  $items = array();

  $items['test/test'] = array(
    'title' => 'Edit this node',
    'description' => 'Edit this node.',
    'page callback' => 'drupal_goto',
    'page arguments' => array('node/4/edit'),
    'access callback' => TRUE,
  );
  return $items;
}
7
24.01.2020, 22:51
  • 1
    Спасибо, теперь это кажется настолько очевидным! Идентификатор узла не предназначен для помех в конце, который был просто для тестирования. Идея состоит в том, чтобы добавить форму к представлению, которое имеет nid как поле. Таким образом, я предполагаю, что решением 2 не является способ пойти, так как это перенаправляет? –  user8878 25.07.2012, 23:36
  • 2
    Да, перенаправление не поможет при присоединении формы к другой странице. Вы могли бы также хотеть посмотреть на views_embed_view (), могло бы помочь, создаете ли Вы страницу с несколькими разными вещами в нем –  Clive♦ 26.07.2012, 02:17
  • 3
    Таким образом, что лучшая практика должна загрузить включать файлы? Ваше решение, kiamlaluno решение (в этом вопросе) или этом fragmentedthought.com/fragments / …? @Clive –  Mouneer 05.10.2015, 15:09

Необходимо определить обратный вызов меню как в следующем коде.

  $items['test/test'] = array(
    'title' => 'Edit this node',
    'description' => 'Edit this node.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('page_node_form', $node),
    'file path' => drupal_get_path('module', 'node'),
    'file' => 'node.pages.inc',
    'access callback' => TRUE,
  );

Помните что реализация hook_menu() вызывается только, когда меню, восстанавливают, не каждый времена, новую страницу требуют к Drupal. Как последствие этого, форма получила бы обновленный объект узла только, когда Ваш модуль установлен, или когда меню восстанавливаются; в других случаях форма получит статическую копию объекта узла, который не отражает фактический объект узла.

Было бы лучше сделать тест/тест псевдонимом пути для node/4/edit. Таким образом форма получила бы обновленный объект узла каждый раз.

3
24.01.2020, 22:51
  • 1
    Спасибо также за быстрый ответ, Вы парни качаются! Как сказано выше, я просто установил его на статический nid для тестирования. –  user8878 25.07.2012, 23:41

Теги

Похожие вопросы