我想从模块而不是template.php预处理和设置我的节点。之前,我在theme_preprocess_node()
中有一个巨大的switch语句。但这只适用于我的主要标签 - 子标签是从定义的模块中模板化的。所以我喜欢将所有预处理功能和模板合并到一个有组织的模块中。
我想要的结构基本上是这样的(提取摘要的详细信息):
function foomodule_menu()
{
$items['foo/%node'] = array(
'page callback' => 'page_foo_overview',
'page arguments' => array(1),
'type' => MENU_NORMAL_ITEM,
);
$items['foo/%node/overview'] = array(
'type' => MENU_DEFAULT_LOCAL_TASK,
);
$items['foo/%node/details'] = array(
'page callback' => 'page_foo_details',
'page arguments' => array(1),
'type' => MENU_LOCAL_TASK,
);
}
function foomodule_theme()
{
return array(
'page_foo_overview' => array(
'arguments' => array('node' => NULL),
'template' => 'templates/page-foo-overview'
),
'page_foo_details' => array(
'arguments' => array('node' => NULL),
'template' => 'templates/page-foo-details'
),
);
}
function page_foo_overview($node)
{
// Used to do this, and themed it from template.php
// return node_view($node, FALSE, TRUE);
// Instead, I'd like to theme all pages directly in this module:
return theme('page_foo_overview', $node);
}
function template_preprocess_page_foo_overview(&$vars)
{
// But $vars doesn't contain the same data as when I themed from template.php
// Specifically the ['view'] element of CKK fields, and flags like $teaser
// What do I need to do to get at the same data?
dsm($vars);
}
一切都很好,但我预处理中可用的$ vars不是我在template.php的theme_preprocess_node()
函数中习惯的。例如,看起来CCK字段尚未通过content_format()
(没有['view']元素),并且缺少teaser
和page
等标记。
我可以在theme_preprocess_node()
之前调用什么?
我这样做是在惹麻烦吗?让它组织起来并控制每一步对我来说更有意义:菜单>页面回调>主题>预处理>模板,并且能够在我认为合适的情况下跨多个模块组织这个模块。
答案 0 :(得分:1)
AK,
我的建议是执行以下代码来检查可用的变量
<?php
$arr = get_defined_vars();
dsm($arr);
?>
如果这没有帮助,您可以检查系统表上模块的重量。也许更改它(使模块在其他模块之后运行)可以帮助你。