2

さて、これが取引です。私はいくつかの異なるセクションを持つDrupalWebサイトを構築しています。各セクションは、コンテンツタイプを表示するビューです。(各セクションには独自のコンテンツタイプがあります)たとえば、?q=blogコンテンツタイプを表示するポイントを指すビューがありますblog

すべてのセクションは互いに少し異なって見えます。'website-within-a-website'とは異なりますが、すべてが同じテンプレートファイルを使用できず、それぞれがCSSで変更されるほどの違いがあります。各セクションには独自のが必要page.tpl.phpです。

残念ながら、AFAIK Drupalテーマの.infoファイルはpage.tpl.php、テーマ全体に1つだけ割り当てるか、page-node-####.tpl.phpノードごとに1つしか割り当てることができません。このWebサイトには多くのコンテンツが含まれるためpage-node-####.tpl.php、作成されたすべてのノードに対して新しい同一のものを作成するようにDrupalを設定すると、非常に高速に管理できなくなります。

この問題を解決するために、pathautoを使用して各コンテンツタイプのエイリアスを作成します。たとえば、コンテンツタイプのすべてのノードにはblogエイリアスが与えられ?q=blog/[post title]ます。エイリアスが「blog」という単語で始まるページtemplate.phpに使用するように変更します。page-blog.tpl.php

他の人はこのようなことをやってみて、説明したような関数を作成しました。残念ながら、私が見たものはすべてDrupal6以下のものです。既存のものを変更しようとしましたが、成功しませんでした。ただし、これまでのところ、これは正しい方向に進んでいると思います。

function basic_preprocess_page(&$vars, $hook) {
    ...

    if( module_exists('path') ) {
        $alias = drupal_get_path_alias( $_GET['q'] );
        $site_section = "blog";
        if( strpos( $alias, $site_section ) === 0 ) {
            $VARIABLE_THAT_TELLS_THE_PAGE_WHAT_TEMPLATE_TO_USE = "/path/to/page-blog.php";
        }
    }
}

私は$VARIABLE_THAT_TELLS_THE_PAGE_WHAT_TEMPLATE_TO_USEそれが何であるか誰もが知っているのを見つけることができませんか?

たぶん私のサイトはひどく構成されています。誰かが私のサイトを再構築して、別々のセクションでより簡単にテーマを作成できるようにする方法を知っているなら、その方法を共有してください!

どうもありがとう!(c:

編集:おそらく、代わりにテンプレートの提案を使用する必要があります。これを設定するために使用する関数または変数を知っている人はいますか?

4

2 に答える 2

3

彼らはD7でこの配列キーの名前を変更しましたが、私はそれがどこにも文書化されているのを見たことがありません。かなりのデバッグを行った後、私はついにこれを理解しました。次のように、template.phpのテーマテンプレートをhook_preprocess_page()でオーバーライドできます。

function myTheme_preprocess_page(&$vars) {
global $node;

if ($node->type == 'blog') {
     $vars['theme_hook_suggestions'] = array('my__blog_template'); // use my--blog-template.tpl.php, note '-' = '_'
}
elseif ($node->type == 'articles') {
    $vars['theme_hook_suggestions'] = array('article__node_template'); // use article--node-template.tpl.php
}
}

ああ、template.phpに変更を加えた後、Drupalキャッシュをフラッシュすることを忘れないでください。

于 2011-04-13T01:05:53.767 に答える
0

わかりました、見つけました: http://drupal.org/node/223440#comment-991840

$alias = drupal_get_path_alias($_GET['q']);
  if ($alias != $_GET['q']) {
    $template_filename = 'page';
    foreach (explode('/', $alias) as $path_part) {
      $template_filename = $template_filename . '-' . $path_part;
      $variables['template_files'][] = $template_filename;
    }
  }

この機能の功績は、ユーザー mfb に帰属します。

私はこれに多くの問題を抱えていたので、誰かが役に立つと思った場合に備えてここで説明します.

この関数は、template.php. 関数の一部である必要があり<theme name>_preprocess_pageます。それが行うことは、エイリアスを受け取り、それをさまざまなコンポーネントの束に分解することです。たとえば、エイリアスを持つページにいる場合、and?q=blog/blog-post-titleに分解されます。次に、各コンポーネントをテンプレート候補の名前に変換します。各テンプレートの提案を配列 (配列内) に入れるため、ページには 2 つの新しいテンプレートの提案が含まれるようになります。blogblog-post-titletemplate_files[]$variables[]

page-blog、 とpage-blog-blog-post-title

テンプレートの提案は、代替テンプレート ファイルです。この場合、それらはページ用ですが、必ずしもそうである必要はありません。ブロック、ノードなど、考えられるあらゆるものに対してテンプレートの提案を行うことができます。「テンプレートの提案」という名前に惑わされないでください。テンプレートの提案は、それらが存在する限り、既定のテンプレートよりも優先して使用されます。なぜそのような名前になったのかはわかりません。改名すべきだと思います。

エイリアスを指すテンプレートの提案を探すように Drupal を設定したので、次は新しいテンプレート ファイルを作成します。残りはすべてテーマに含まれています。この場合、ブログ セクション全体にテーマを設定したいとします。テンプレート フォルダーにpage--blog.tpl.php、目的のレイアウトで (--2 つのハイフンに注意してください--) という名前のファイルを作成する必要があります。

Drupal は、見つけた最も具体的なテンプレートの提案を使用します。そのため、必要に応じて、名前page--blog--blog-post-titleを付けたテンプレートを作成し、テーマのテンプレート ディレクトリに配置する限り、1 つのブログ投稿をサイトの他の部分とはまったく異なるものにすることができます。(繰り返しますが、二重ハイフンに注意してください。)

于 2011-04-12T22:03:43.253 に答える