Разница в рендеринге при посещении узла / 1 и программной загрузке его - PullRequest
3 голосов
/ 17 января 2011

Узел загружает профиль пользователя (внешняя база данных + представления).Все это работает, когда я захожу: узел / 123 / профиль / id / 3.Теперь я реализовал hook_menu (), чтобы загрузить любую страницу профиля и иметь более приятные URL.

Когда я сам по какой-то причине загружаю его, $ left в page.tpl.php внезапно становится пустым, и кажется, что многие другие переменные не загружаются.Я пробовал много разных функций для рендеринга и создания правильного вывода в $, но понял, что node_show (), кажется, является функцией выбора.

Теперь тестирование показало, что по какой-то причине hook_nodeapi() звонки игнорируются.
Мой код:

/**
 * Implementation of hook_menu
 */
function modulename_menu() {
  $items = array();

  $items['my/nice/url/profile'] = array(
    'description' => 'This page holds a view that shows profiles based on the %',
    'page callback' => 'website_profile_load',
    'access callback' => TRUE,
    'type' => MENU_CALLBACK, 
  );

  return $items;
}

/**
 * Menu path wildcard callback
 */
function website_profile_load() {
  $output = node_show(node_load(1221), false, true);
  return $output;
}

Итак, как правильно сделать это и получить Панели (см.комментарий ниже) для правильной загрузки?

ОБНОВЛЕНИЕ:

Я использую мастер таблиц и Views 2 для подключения к другой базе данных с информацией о людях, которые не являются пользователямисистема.Это страница выпускников, страница администрируется извне и показывается внутренне (я ничего не могу с этим поделать, приходится делать эту работу:)

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

Ответы [ 3 ]

0 голосов
/ 18 января 2011

Существует множество причин, по которым рендеринг результата node_load отличается от перехода на стандартный путь / узел Drupal. Честно говоря, это слишком сложно, но короткий ответ заключается в том, что вы должны определить шаблон / тему, блоки и т. Д. Для каждой создаваемой страницы. То, что вы создаете новый путь и выполняете node_load в обратном вызове для этого пути, не означает, что Drupal может автоматически определить, как вы хотите отображать этот контент. Он просто загружает данные с узла и после этого может делать с ним все, что угодно. Вот почему вы получаете пустую страницу, а не то, что ожидаете от прохождения / узла.

Однако я предложу это простое решение, так как похоже, что вы хотите точно такую ​​же страницу, которую вы получите, когда перейдете в «node / 123 / profile / id / 3», но доступную по ссылке, которую вы определяете сами. Вам просто нужно настроить перенаправление в вашем hook_menu примерно так:

$items['my/nice/url/profile'] = array(
'description' => 'This page holds a view that shows profiles based on the %',
'page callback' => 'drupal_goto',
'page arguments' => 'node/123/profile/id/3',
'access callback' => TRUE,
'type' => MENU_CALLBACK);

По сути, это говорит о том, что когда вы переходите к «my / nicer / url / profile», он запускается: drupal_goto ('node / 123 / profile / id / 3');

0 голосов
/ 20 января 2011

Я нашел ответ, что, очевидно, где-то в процессе создания узла Drupal использует $path (изначально установленный $_GET['q']), а иногда также $_GET['q'], чтобы определить, как отобразить страницу. Обратите внимание, что я использую модули Panels и Ctools Page Manager, чтобы мои вещи работали правильно.

Оказывается, Panels, если вы ищете код, смотрит на $_GET['q'] довольно много вещей.

Вот что я закончил:

/**
 * Implementation of hook_menu
 */
function modulename_menu() {
  $items = array();

  // For department and having nice URL's for their profile pages.
  $items['my/nice/url/profile/%'] = array(
    'description' => 'This page holds a view that shows profiles based on the %',
    'page callback' => 'website_profile_load',
    'page arguments' => arg(4),
    'access callback' => TRUE,
    'type' => MENU_CALLBACK, 
  );

  return $items;
}

/**
 * Menu path callback
 */
function website_profile_load($id = NULL) {

  // Rename the query internally since other functions base the design
  // on the way the query is structured and not simply by the node which
  // is currently loading.
  if(!empty($id)) {
    $path = $_GET['q'] = 'node/1221/profile/id/' . $id;
  }

  // Use ctools function to correctly display node view since 
  // this site heavily uses ctools rendering for panels and
  // web parts / web pages.  
  drupal_load('module', 'page_manager');
  ctools_include('node_view', 'page_manager', 'plugins/tasks');

  if(function_exists('page_manager_node_view')) {
    $output = page_manager_node_view(node_load(1221));
  } else {
    // Will display incorrectly but still load the UI 
    $output = node_page_view(node_load(1221));
  }

  return $output;
}

И это работает:)

0 голосов
/ 17 января 2011
/**
 * Menu path wildcard callback
 */
function website_profile_load($uid = null) {
  if (!$uid) {
    global $user; // if no user passed in argument, show current user profile
    $uid = $user->uid;
  }
  $output = drupal_render(content_profile_show_profiles($uid));
}
...