Менеджер страниц Drupal: Могу ли я предоставить вариант в моем модуле? - PullRequest
5 голосов
/ 14 октября 2011

У меня есть модуль, который предоставляет несколько страниц модулю Page Manager, используя hook_default_page_manager_pages(). Это работает хорошо. Но теперь я также хотел бы предоставить вариант для системы, включенной node/%node page. Но я не могу найти никаких зацепок для предоставления вариантов.

Моя проблема заключается в том, что я не могу создать свою собственную страницу для перезаписи узла /% узла, поскольку это уже обеспечивается самим модулем Page Manager, поэтому единственный способ, которым я могу создавать страницы, которые принимают нормальное представление узла, это предоставить вариант (из моего понимания). Но как я могу сделать это программно? Я вижу, что можно экспортировать вариант, и, следовательно, я предполагаю, что было бы также возможно предоставить его через крючок?

Возможно ли это как-нибудь?

Ответы [ 2 ]

9 голосов
/ 16 октября 2011

Я нашел то, что искал.

Чтобы предоставить варианты построения страниц с помощью менеджера страниц в коде, в файле модуля вызовите hook_ctools_plugin_api (), чтобы сообщить менеджеру страницы, что он должен слушать вашиmodule:

/**
 * 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.Если у кого-то есть подсказка, не стесняйтесь поделиться ею со мной:)

0 голосов
/ 15 октября 2011

Извинения, если я неправильно понял, но я думаю, что есть два способа атаковать это:

Во-первых, вы можете реализовать 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() функция ).

Надеюсь, что это поможет

...