URL을 기준으로 테마를 변경하려면 어떻게합니까?


38

example.org에서 Drupal 인스턴스를 실행하고 있습니다. 테마 X가 설치되어 활성화되어 있습니다. 이제 제한된 기간 동안 특별 섹션이 "조각 된"사이트에서 이벤트가 개최됩니다. 해당 이벤트와 관련된 모든 것은 example.org/event2011로 이동합니다.

이 섹션 아래의 페이지를 볼 때마다 다른 테마를 표시하고 싶습니다 (예 : http://example.org/event2011/about , http://example.org/event2011/node/123 ). 어떻게합니까?

나는 많은 모듈을 겪었지만 Drupal 7을 지원하지 않는 모듈이 있습니다. 모듈을 사용하여 수행하고 싶고 코드 레벨에서 내 자신을 변경하고 싶지는 않습니다.


1
/ event2011 / node / 123 경로 아래에 완전히 별도의 사이트가 있습니까?
Jeremy French

답변:


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/…을 제안합니다 . 당신은 조건 "에 대한"쉬운 것
아우

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

당신은 간단하게 사용할 수있는 컨텍스트 및 테마를 사용하는 경로가 cotext의 상태 경로가 / event2011 / 당신이 할 수있는 간단한 설정하면 적용받을하고 컨텐츠의 작용에 테마를 변경합니다. URL을 기반으로 사이트의 테마를 매우 쉽게 전환 할 수있었습니다. 휴대폰에서도 작동합니다.)


테마 액션은 사용자 정의 변수를 테마로 전달하지만 실제로는 변경되지 않습니다.
Alex Weber

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 별칭 또는 Pathauto 모듈을 현재 드루팔 경로의 구성 요소를 사용하는 경우, 미묘과 차이점을 인식.

arg () 를 사용하고 싶지 않은 상황이 있습니다 . 실제로 Drupal API 문서는 결과 코드를 읽기가 어렵 기 때문에 가능한 경우이 기능을 사용하지 않는 것이 좋습니다.

kiamlaluno가 제안한 다음 예를 고려하십시오 .

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

Drupal 7에서 노드에 별명이 event2011 인 경우 별명이 아닌를 사용 하여 첫 번째 URL 구성 요소로 arg(0)리턴 node합니다.

print_r(arg(0));

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

당신이 별칭으로 작업해야하는 경우 대신, 거기에 여러 드루팔에 현재의 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

페이지 테마 모듈 을 사용하여 정확하게 달성 할 수 있습니다 . 페이지 테마 모듈은 사용하기 간단하고 쉬운 모듈로 특정 페이지의 사이트 기본값과 다른 테마를 사용할 수 있습니다.

특징 :

단일 페이지 또는 페이지 목록에 테마를 지정하십시오. (페이지를 Drupal 경로로 설정) Drupal 경로에서 '*'문자를 와일드 카드로 사용할 수 있습니다. 테마를 정렬 할 수 있습니다. 페이지가 여러 개 정의 된 경우 목록의 첫 번째 테마가 사용됩니다. 테마를 활성화 / 비활성화 할 수 있습니다. Drupal 초보자에게 친숙합니다.

사용할 수있는대로 : 페이지 테마와 대부분 동일한 기능을 가지고 있지만 테마를 선택하기 위해 역할 기반 선택 및 "php 스 니펫"영역을 추가하는 섹션.

그러나 컨텐츠 작성, 편집 및 페이지보기 에서 사이트 기본값과 다른 테마를 사용하려면 컨텐츠 작성, 편집 및 페이지보기에서 사이트 기본값과 다른 테마를 사용할 수있는 컨텐츠 테마 를 사용할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.