6

を使用してページ マネージャー モジュールに多数のページを提供するモジュールがありますhook_default_page_manager_pages()。これはうまくいきます。しかし今、私は含まれているシステムのバリアントも提供したいと思いますnode/%node page. しかし、バリアントを提供するためのフックが見つかりません。

私の問題は、node/%node を上書きする独自のページを作成できないことです。これは、Page Manager モジュール自体によって既に提供されているため、通常のノード ビューを引き継ぐページを作成できる唯一の方法は、バリアント(私の理解から)。しかし、どうすればプログラムでこれを行うことができますか? バリアントをエクスポートできることがわかりました。したがって、フックを介して提供することも可能でしょうか?

これは何らかの方法で可能ですか?

4

2 に答える 2

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)私が発見しなければならないのは、モジュールがプログラムでページマネージャーのノード/%ノードページを有効にする方法だけです。手がかりがあれば、遠慮なく私と共有してください:)

于 2011-10-15T22:08:17.773 に答える
0

誤解していたら申し訳ありませんが、これを攻撃する方法は 2 つあります。

まず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ページ マネージャー モジュールよりも高いことを確認する必要があります (そのため、フックは後で呼び出され、いわば最終決定権を持ちます)。

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()関数を参照してください)。

それが役立つことを願っています

于 2011-10-14T21:02:25.607 に答える