web-dev-qa-db-ja.com

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

Drupalインスタンスがexample.orgで実行されています。これにはテーマXがインストールされてアクティブ化されています。今、特別なセクションがあるサイトでイベントが開催される期間が限定されています。そのイベントに関連するすべてのものはexample.org/event2011に行きます。

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

私は多くのモジュールを試してみましたが、Drupal 7.をサポートしているモジュールはありません。できれば、モジュールを使用してそれを行い、コードレベルで自分自身を変更したくない。

38
Samyak Bhuta

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

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/12 の場合は必要ない場合、次にコードを次のように変更する必要があります

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

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

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

33
kiamlaluno

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

22
tim.plunkett

または、以下に概説するように、メニューシステムhook_menu_alter()の新しい_theme callback_オプションを使用できます。 p.sチェックアウト 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

8
electblake

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)

チェックアウト マスタードシードによるビデオチュートリアル (7.x)。

そのトピックの詳細については、/admin/help/themekeyをご覧ください。

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


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

6
kenorb

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

6
Amitav Roy

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

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

kiamlalunoによって提案された次の例を考えます。

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

Drupal 7で、ノードにevent2011のエイリアスがある場合、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';
  }
}
_
5
rjb

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

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

<?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 =>切り替え先のテーマの名前

3
drupalfever

Page Theme モジュールを使用して、正確にそれを実現できます

ページテーマモジュールはシンプルで使いやすいモジュールで、特定のページでサイトのデフォルト以外のテーマを使用できます。

特徴

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

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

特徴 :

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

使用できるように:ページテーマとほとんど同じ機能を備えたセクションですが、ロールベースの選択とテーマを選択するための「phpスニペット」領域が追加されます。

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

0
onlink