web-dev-qa-db-ja.com

カスタムモジュールでのhook_theme()の使用に関するヘルプ

私は、コンテンツタイプを2ページに分割するカスタムモジュールを作成しており、カスタムフィールドはタブからアクセスできます。簡単にするために、新しいd7インストールでテストケースを作成し、定義済みの記事コンテンツタイプを使用しました。

私のモジュールフォルダには次のファイルがあります:

module folder view

これで、テンプレートファイルはbartikテーマのnode.tpl.phpファイルのコピーにすぎませんが、何らかの理由でモジュールがロードしません。私はhook_theme()ページを読み、開発者theming_exampleの例を使用しましたが、それを機能させることができません。

どんな助けでも大歓迎です。

--------更新されたコード----------------

    <?php
    /**
     * Implements hook_menu().
     */
    function article_page_menu() {

      $items['node/%/info'] = array(
        'title' => 'Info',
        'page callback' => 'article_page_page_callback',
        'page arguments'   => array(1),
        'access callback' => 'article_page_access_callback',
        'access arguments' => array(1),
        'type' => MENU_LOCAL_TASK, // tab instead of MENU_CALLBACK
        'weight' => '1000', // last tab item
      );

      return $items;
    }

    /**
     *  Page Callback
     */
    function article_page_page_callback($nid) {
      if (is_numeric($nid)) {
        $node = node_load($nid);

        if($node->type == 'article') {
          return theme('article_page_template', array('node' => $node));
        }

        drupal_not_found();
        return;
      }
      return FALSE;
    }

    /**
     *  Create the access callback
     */
    function article_page_access_callback($nid) {
      if (is_numeric($nid)) {
        $node = node_load($nid);
        // only show for article types
        if($node->type != 'article'){ 
          return FALSE;
        } else {
          return TRUE;
        }
      }
      return FALSE;
    }

    /**
     * Implements hook_theme().
     */
    function article_page_theme($existing, $type, $theme, $path) {
      return array(
        'article_page_template'  => array(
          'template' => 'article_page_template',
        ),
      );
    }

    function theme_article_page_template($variables) {
      $node = $variables['node'];
      $build = node_view($node);
      $output = drupal_render($build);
      return $output;
    }

------------ END UPDATED CODE -----------

---------以下IS THE OLD CODE ---------------------

モジュールファイルのコードは次のとおりです。

        <?php
        /**
         * Implements hook_menu().
         */
        function article_page_menu() {

          $items['node/%/info'] = array(
            'title' => 'Info',
            'page callback' => 'article_page_load',
            'page arguments'   => array(1),
            'access callback' => 'article_page_access',
            'access arguments' => array(1),
            'type' => MENU_LOCAL_TASK, // tab instead of MENU_CALLBACK
            'weight' => '1000', // last tab item
          );

          return $items;
        }

        /**
         * Constructs a descriptive page.
         */
        function article_page_load($nid) {
          if (is_numeric($nid)) {
            $node = node_load($nid);

            if($node->type == 'article') {
              // convert object to array
              // else we get an error
              $build = node_view($node);
              $render = drupal_render($build);
              return $render;
            }
            drupal_not_found();
            return;
          }
          return FALSE;
        }

        /**
         *  Create the access callback
         */
        function article_page_access($nid) {
          if (is_numeric($nid)) {
            $node = node_load($nid);
            // only show for article types
            if($node->type != 'article'){ 
              return FALSE;
            } else {
              return TRUE;
            }
          }
          return FALSE;
        }


        /**
         * Implements hook_theme().
         */
        function article_page_theme($existing, $type, $theme, $path) {
          return array(
            'article_page_template'  => array(
              'template' => 'article_page_template',
            ),
          );
        }
2
tecjam

モジュールコードに誤って使用されている要素がかなりあるようです。たとえば、ページコールバックはフックであってはならず( hook_load() を使用しています)、コールバックは theme() を呼び出してカスタムテーマ関数を呼び出す必要があります。さらに、あなたの hook_theme() の実装は正しくなく、テーマシステムにテンプレートファイルについて知らせるために、モジュールに hook_theme_registry_alter() を実装する必要もあります。

これに基づいてコードをベースにすることができるすべての良い例があります フックのテーマのAPIのコメント

また、「ノード」と「ページ」という用語が混在しているようですので、用語を正しく使用しているかどうかはわかりません(つまり、ノードテンプレートを誤ってベースとして使用しているかどうかはわかりません。本当にページテンプレートを使いたいなど)

3
sheena_d

必要に応じて、ここにD8のhook_themeのクイックチュートリアルがあります: http://westweb-solutions.com/blog/drupal-8-how-use-hooktheme 。少しトリッキーですが、D8は急速に地位を獲得しています。

0
bret