我有一个模块,它使用hook_default_page_manager_pages()
向页面管理器模块提供了许多页面。这很好。
但现在我还想为包含node/%node page
的系统提供一个变体。但我找不到提供变种的任何钩子。
我的问题是,我无法创建自己的页面来覆盖节点/%节点,因为这已经由页面管理器模块本身提供,所以只有我可以创建接管正常节点视图的页面,提供变体(根据我的理解)。 但是我该如何以编程方式执行此操作? 我可以看到可以导出变量,因此我猜也可以通过钩子提供它吗?
这有可能吗?
答案 0 :(得分:9)
我找到了我要找的东西。
为代码中的页面管理器构建页面提供变体,在模块文件中调用hook_ctools_plugin_api(),让页面管理器知道它应该监听你的模块:
/**
* Implement hook_ctools_plugin_api().
*
* Tells ctools, page manager and panels, that we have a template ready
*/
function mtvideo_ctools_plugin_api($module, $api) {
// @todo -- this example should explain how to put it in a different file.
if ($module == 'panels_mini' && $api == 'panels_default') {
return array('version' => 1);
}
if ($module == 'page_manager' && $api == 'pages_default') {
return array('version' => 1);
}
}
现在在模块根文件夹中创建一个名为MODULE_NAME.pages_default.inc的新文件。 在此文件中,您现在可以包含以下功能:
hook_default_page_manager_pages()
/**
* If you want to put an entire page including its variants in code.
* With the export module from ctools, you can export your whole page to code.
* Paste that into this function.
* (Be aware that the export gives you $page, but you need to return an array,
* So let the function return array('page name' => $page);
*/
和/或
hook_default_page_manager_handlers()
/**
* This will provide a variant of an existing page, e.g. a variant of the system
* page node/%node
* Again, use the export function in Page Manager to export the needed code,
* and paste that into the body of this function.
* The export gives you $handler, but again you want to return an array, so use:
* return array('handler name' => $handler);
*
* Notice, that if you export a complete page, it will include your variants.
* So this function is only to provide variants of e.g. system pages or pages
* added by other modules.
*/
我希望有一天能帮助另一个人:o) 我唯一要发现的是我的模块如何以编程方式启用Page Manager中的节点/%节点页面。 如果有任何人有线索随意与我分享:)
答案 1 :(得分:0)
如果我误解了道歉,但我认为有两种方法可以解决这个问题:
首先,您可以实现hook_menu_alter()
来覆盖路径的页面回调:
function mymodule_menu_alter(&$items) {
$items['node/%node']['page callback'] = 'mymodule_node_page_callback';
}
function mymodule_node_page_callback($node) {
// Build up the content and return
}
在这种情况下,您需要确保在system
表中,您的模块在weight
列中的值高于Page Manager模块(因此您的挂钩将在稍后调用并且会有最后的发言权。)
其次,你可以实现hook_node_view()
并完全覆盖内容:
function hook_node_view($node, $view_mode, $langcode) {
if ($view_mode == 'full') {
$node->content = array();
$node->content['title'] = array('#markup' => '<h1>' . $node->title . '</h1>';
// Build up the rest of the content
}
}
在这种情况下,您需要将内容构建为渲染数组(请参阅drupal_render()
function)。
希望有所帮助