URLに基​​づいてテーマを変更するにはどうすればよいですか?


38

example.orgでDrupalインスタンスを実行しています。テーマXがインストールおよびアクティブ化されています。現在、限られた期間、イベントが特別なセクションが「切り分けられた」サイトで開催されることになっています。そのイベントに関連するすべてのものは、example.org / event2011に送られます。

私は、このセクションの下のページが表示されるたびに表示されるために異なるテーマを持ちたい(例えばhttp://example.org/event2011/abouthttp://example.org/event2011/node/123)。それ、どうやったら出来るの?

私は多くのモジュールを試しましたが、それらのどれもDrupal 7をサポートしていません。できれば、モジュールを使用してそれを行い、コードレベルで自分自身を変更したくないことが望ましいです。


1
/ event2011 / node / 123のパスの下に、まるで別のサイトを探していますか?
ジェレミーフランス語

回答:


33

変更は限られた期間であり、そのようなコードの実装は困難ではないと考えると、特定のページに使用されているテーマを変更するカスタムモジュールを実装することをお勧めします。

hook_custom_theme()次のように実装するだけで十分です。

function mymodule_custom_theme() {
  if (arg(0) == 'event2011') {
    return 'the theme to use for that page';
  }
}

あなただけのテーマを変更する必要があります場合はhttp://example.com/event2011のためではなく、http://example.com/event2011/node/123、コードに変更する必要があります

function mymodule_custom_theme() {
  if (arg(0) == 'event2011' && !arg(1)) {
    return 'the theme to use for that page';
  }
}

メニューコールバックの定義でテーマコールバックを使用する場合、ドキュメントには次のように記載されています。

一般的なルールとして、テーマコールバック関数の使用は、特定のテーマに非常に密接に関連付けられているページに限定する必要がありますhook_menu_alter()。これらのページは、のページを特に対象とするモジュールによってのみオーバーライドできるためです。hook_custom_theme()代わりに、より汎用的なテーマ切り替え機能を実装するモジュール(たとえば、現在のユーザーの役割に基づいてテーマを動的に設定できるモジュール)を使用する必要があります。


current_path()関数api.drupal.org/api/drupal/includes%21path.inc/function/…をお勧めします。「for」条件がより簡単になります
8

22

他のコメントが示唆するようなカスタムソリューションがおそらく最善ですが、本当にモジュールを使用したい場合、最善の策はThemeKeyです。5/23/11の時点で、安定したリリースがあります。


8

または、以下に概説するようtheme callbackに、メニューシステムの新しいオプションを使用できhook_menu_alter()ます。ps Checkout hook_menu()の詳細についてはtheme callback

<?php
/**
* Implements hook_menu_alter().
*/
function mymodule_menu_alter(&$items) {
  // Set the theme callback function for all node pages. As per the
  // standard behavior for hook_menu() properties, this will be
  // inherited by all paths underneath node/%node as well, unless
  // they define their own theme callback.
  $items['node/%node']['theme callback'] = 'mymodule_default_node_theme';

  // Set a different theme callback for node edit pages, and pass
  // along the node object to this function so we can make decisions
  // based on it.
  $items['node/%node/edit']['theme callback'] = 'mymodule_edit_node_theme';
  $items['node/%node/edit']['theme arguments'] = array(1);
}
/**
* Defaults to using the 'some_theme' theme for node pages.
*/
function mymodule_default_node_theme() {
  return 'some_theme';
}

/**
* For editing page nodes, uses the 'some_other_theme' theme.
*/
function mymodule_edit_node_theme($node) {
  return $node->type == 'page' ? 'some_other_theme' : mymodule_default_node_theme();
}
?>

さらに、より伝統的な方法を使用する例もあります hook_custom_theme()

<?php 
/**
* Implements hook_custom_theme().
*/
function mymodule_custom_theme() {
  // check path using arg(0)
  // check $user
  // do whatever special checking you want and simply return theme key (name of theme folder most of the time)
    return 'special_theme';
  }
}
?>

から取得:http : //drupal.org/node/224333#custom_theme


6

単純にコンテキストを使用し、パスが/ event2011 /の場合にテーマを使用して適用できます。コテキストの条件でパスを設定し、コンテンツのアクションでテーマを変更できます。これは、URLに基​​づいてサイト上のテーマを非常に簡単に切り替えることができました。携帯電話でも動作します;)


テーマアクションをテーマにカスタム変数を渡し、それが実際にそれを変更しません
アレックス・ウェーバー

6

ThemeKeyの使用はシンプルで、現在のパス、分類用語、言語、ノードタイプなどに応じてテーマを自動的に選択できるテーマ切り替えルール用の(8.xをサポートする)これまでで最も人気があり強力なモジュールです。他の多くのプロパティ。また、他のモジュールによって公開される追加のプロパティをサポートするために簡単に拡張できます。標準機能に加えて、ThemeKeyは多くのcontribモジュールの機能を自動的に拡張し、モジュールを拡張します。

使用法(7.x)

モジュールを有効にした後、に進みadmin/config/user-interface/themekeyます。テーマを切り替えるには多くのオプションがありますが、おそらく興味がpath:node_aliasあるので、/ my_urlのように値を設定し、このURLで有効にするテーマを選択します。web/*またはなどのワイルドカードを使用することもでき/^web/.*ます。

チェック:パスのテーマを読み込む方法

高度な使用法

ThemeKey 7.xには、開発者がThemeKeyを拡張する方法を示すThemeKey Exampleというオプションモジュールが含まれています。

ヘルプ(7.x)

Mustardseed(7.x)によるビデオチュートリアルをご覧ください。

そのトピックに関する詳細なヘルプはにあります/admin/help/themekey

関連する他のSEの質問も確認してください。


または、ユーザーが有効なテーマを切り替えることができるようにブロックを追加するSwitchtheme(7.x)もあります。


5

使用する場合はURLエイリアスまたは自動エイリアス設定モジュールのモジュールを、現在のDrupalのパスのコンポーネントを使用して、微妙な点や相違点に注意してください。

arg()を使用したくない場合があります。実際、Drupal APIのドキュメントでは、結果のコードは読みにくいため、この関数の使用を可能な限り避けることを提案しています。

kiamlalunoが提案する次の例を考えてみましょう。

function mymodule_custom_theme() {
  if (arg(0) == 'event2011') {
    return 'custom_theme_machine_name';
  }
}

Drupal 7では、ノードのエイリアスがevent2011の場合、using arg(0)はエイリアスではなくnode最初のURLコンポーネントとして返されます。

print_r(arg(0));

Array
(
    [0] => node
    [1] => 150
)

エイリアスを使用する必要がある場合は代わりに、そこにあるいくつかのDrupalで現在のURLを取得する方法を含め、menu_get_object()current_path()request_path()など。

以下は、テーマを切り替えるトリガーとしてエイリアスを使用する、作り直された例です。

function mymodule_custom_theme() {
  $current_page_path = explode('/', request_path());      

  if ($current_page_path[0] == 'event2011') {
    return 'custom_theme_machine_name';
  }
}

3

ユーザーの役割に応じてテーマを切り替える方法:

カスタムモジュールを作成し、次をコピーして貼り付けます。

<?php
/**
 * Implementation of hook_init().
 */
function mymodule_init() {
  global $custom_theme, $user;
  if (in_array('my special role', $user->roles)) {
    $custom_theme = 'mytheme';
  }
}
?>

交換する必要があります:

mymodule =>モジュール名

私の特別な役割=>ユーザーが異なるテーマを見るために必要な役割の名前。

mytheme =>切り替えたいテーマの名前


1

あなたは正確にそれを達成するためにページテーマモジュールを使用できます

ページテーマモジュールは、特定のページでサイトのデフォルトとは異なるテーマを使用できるようにする、シンプルで使いやすいモジュールです。

特徴

  • テーマを単一のページまたはページのリストに割り当てます。(ページをDrupalパスとして設定します)
  • Drupalパスでワイルドカードとして「*」文字を使用できます。
  • テーマの配置を許可します。(ページが複数定義されている場合、リストの最初のテーマが使用されます)
  • テーマの有効化/無効化を許可します。
  • Drupal初心者に優しい。

0

Page Themeモジュールを使用して、まさにそれを実現できます。PageThemeモジュールは、特定のページでサイトのデフォルトとは異なるテーマを使用できるシンプルで使いやすいモジュールです。

特徴 :

テーマを単一のページまたはページのリストに割り当てます。(ページをDrupalパスとして設定)Drupalパスでワイルドカードとして「*」文字を使用できるようにします。テーマの配置を許可します。(ページが複数定義されている場合、リストの最初のテーマが使用されます)テーマの有効化/無効化を許可します。Drupal初心者に優しい。

使用できる限り:ページテーマとほとんど同じ機能を備えたセクションですが、ロールベースの選択と「phpスニペット」エリアを追加してテーマを選択します。

ただし、コンテンツの作成、編集、および表示で サイトのデフォルトとは異なるテーマを使用する場合は、コンテンツの作成、編集、および表示でサイトのデフォルトとは異なるテーマを使用できるコンテンツテーマを使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.