Менеджер страниц Drupal: Могу ли я предоставить вариант в моем модуле?
У меня есть модуль, который предоставляет несколько страниц для модуля Page Manager, используя hook_default_page_manager_pages()
, Это работает хорошо. Но теперь я также хотел бы предоставить вариант для включенной системы node/%node page
, Но я не могу найти какие-либо крючки для предоставления вариантов.
Моя проблема в том, что я не могу создать свою собственную страницу для перезаписи узла /% узла, так как это уже обеспечивается самим модулем Page Manager, поэтому единственный способ, которым я могу создавать страницы, которые принимают нормальное представление узла, - это предоставить вариант (из моего понимания). Но как я могу сделать это программно? Я вижу, что можно экспортировать вариант, и, следовательно, я предполагаю, что было бы также возможно предоставить его через крючок?
Возможно ли это каким-либо образом?
2 ответа
Я нашел то, что искал.
Чтобы предоставить варианты для построения страниц с помощью менеджера страниц в коде, в файле вашего модуля вызовите hook_ctools_plugin_api(), чтобы Page Manager знал, что он должен слушать ваш модуль:
/**
* 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. Если кто-то знает, не стесняйтесь поделиться им со мной:)
Извините, если я неправильно понял, но я думаю, что есть два способа атаковать это:
Во-первых, вы могли бы реализовать 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()
функция).
надеюсь, это поможет