访问node / 1并以编程方式加载时的渲染差异

时间:2011-01-17 09:10:09

标签: php drupal drupal-6

节点加载用户的配置文件(外部数据库+视图)。当我访问时,所有这些都有效:node / 123 / profile / id / 3。现在我已经实现了hook_menu()以加载任何配置文件页面并拥有更好的URL。

当我因为某种原因自己加载它时,page.tpl.php中的$ left突然变空,并且似乎没有更多的变量被加载。我已经尝试了许多不同的函数来渲染和创建正确的$ output,但意识到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;
}

这样做的正确方法是什么,让Panels(见下面的评论)正确加载?

UPDATE:

我正在使用table wizard和Views 2连接到另一个数据库,其中包含有关不是系统用户的人的信息。这是一个校友页面,页面由外部管理并在内部显示(我无能为力,必须让这项工作:)

刚刚发现Panels根本没有加载。因此,即使我尝试加载的节点由于某种原因使用了面板,也都没有加载。

3 个答案:

答案 0 :(得分:0)

/**
 * 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));
}

答案 1 :(得分:0)

为什么渲染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');

答案 2 :(得分:0)

我发现答案显然是在创建节点的过程中,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;
}

它有效:)