단일 페이지 / 노드에 CSS를 추가 할 수있는 방법이 있습니까?


79

나는 큰 미친 스타일 시트를 정리하고 있는데 (나중에 궁금 할 수도 있음) 특정 노드 또는 페이지에 사용자 정의 CSS를 추가하는 가장 좋은 방법이 궁금합니다.

특히, 내 작업 사이트의 홈 페이지는 패널 페이지이며 다양한 스타일이 있습니다. 현재 CSS는 기본 테마 스타일 시트에 포함되어 있습니다.

"이 노드가 Foo이면 foo.css를 추가하십시오"라고 말하는 방법이 있습니까? 가 CSS 인젝터는 내가 무엇을 찾고?

나는 이것을 다른 노드 / 섹션 / etc에 일반화하는 데 관심이 있을 수 있지만 현재이 항목을 처리하고 싶습니다.

내가 한 일.

Zen 하위 테마를 사용하고 있으며 실제로 template.php를 통해 조건부 스타일 시트를 포함하는 코드가 주석 처리되어 있음을 발견했습니다. 아래 코드는 내가 필요한 것을 정확하게 수행했습니다.

if (drupal_is_front_page()) {
  drupal_add_css(path_to_theme() . "/foo.css", 'theme','all'); 
}

(주식 Zen template.php 파일의 80 행, FWIW)



생성 page--front.tpl.php및page.tpl.php
— 엄마 D

답변:


69

이것은 코드로 수행하는 일종의 일이지만, 그것이 내가 굴리는 방식이기 때문입니다.

template.php에서 당신은 다음과 같은 것을 원할 것입니다 :

function MYTHEME_preprocess_node($vars) {
  if (drupal_get_path_alias("node/{$vars['#node']->nid}") == 'foo') {
    drupal_add_css(drupal_get_path('theme', 'MYTHEME') . "/css/foo.css");
  }
}

foo를 자신의 코드와 관련된 값으로 바꾸십시오.


홈페이지의 경우 if(drupal_is_front_page()) {대신에 사용 if(drupal_get_path_alias [etc]하시겠습니까?
— epersonae

예, 조건은 전적으로 귀하에게 달려 있습니다. 원한다면 간단히 $vars['#node']->nid == $nid확인하면됩니다.
— Decipher

8
해독기, 코드에서 결함을 찾을 수 없습니다. 그러나 Drupal 권한 구성에 대해 이야기하지 않는 한 실제로 역할을 수행하는 방식이 실제로 롤링 방식이어야한다는 점에 유의하지 마십시오. ;-)
— medden

2
참고로, Drupal 7을 사용 $vars['elements']['#node']->nid하고 있으며 별칭 조회에서 대신 사용해야한다는 것을 알았습니다 . 더 없습니다 #node루트에서 vars그것의 모양에서 최신 드루팔 7인치
— Wes Johnson

MYTHEME__preprocess_node ($ vars)보다 앞서 함수가 없어야합니다. 함수의 측면에서 모든 코드가 표시됩니까?
— pal4life 2016 년


16

크리에이트 컨텍스트 를 사용하는 다음 페이지 / 섹션과 상황에 맞는 자산 이 주어진 상황에 대한 CSS 및 / 또는 자바 스크립트를로드 모듈을.

문맥:

컨텍스트를 사용하면 사이트의 다른 부분에 대한 컨텍스트 조건 및 반응을 관리 할 수 ​​있습니다. 각 컨텍스트는 사이트의 "섹션"을 나타내는 것으로 생각할 수 있습니다. 각 컨텍스트에 대해이 컨텍스트를 활성화하는 조건을 선택하고이 활성 컨텍스트에 반응해야하는 Drupal의 다른 측면을 선택할 수 있습니다.

어떤 컨텍스트가 활성화되어 있는지 확인하기 위해 페이지로드 중에 점검되는 규칙 세트로 조건을 생각하십시오. 그런 다음 활성 컨텍스트와 관련된 모든 반응이 시작됩니다.

컨텍스트 자산 추가 :

컨텍스트 추가 자산을 사용하면이 작업을 수행 할 수 있습니다. UI를 사용하여 코드를 작성하지 않고도이 모든 작업을 수행 할 수 있습니다. ctools를 사용하기 때문에이 모든 것도 내보낼 수 있습니다.


문맥에 따라 자산 추가 자산을 문자 그대로 모든 웹 사이트에서 사용합니다. 만약 당신이 문맥에 (내 빌드의 모든 섹션을 구동하는) 자산 추가가 완벽하다면!
— electblake

13

CSS가 적은 경우 노드를 기반으로 CSS 선택기를 만들고 테마의 CSS에 CSS를 포함시키는 것을 고려해보십시오. Drupal 7은 body.page-node-NODEID 선택기를 제공하고 Zen for Drupal 6은 유사한 본문 CSS 클래스를 제공합니다.


그게 내가 무엇을 기본적으로의 한 일을 ... 그리고 거의 200 선을, 그래서 다른 곳으로 이동하는 것이 생각처럼 보였다. (예, 아마도 더 짧아야합니다. 별도의 단계 일 수도 있습니다.)
— epersonae

다른 한편으로, 귀하의 응답은 (Zen child) 템플릿의 template.php를 읽도록 영감을 주었으며 최종 답변을 얻었습니다.
— epersonae

7

사용자 정의 모듈을 작성하고 hook_preprocess_node ()를 사용하여 노드 ID를 기반으로 선택적으로 스타일 시트를로드 할 수 있습니다.

예를 들면 다음과 같습니다.

function MYMODULE_preprocess_node($vars) {
  $nid = 3;
  if (arg(0) == 'node' && is_numeric(arg(1)) && arg(1) == $nid) {
    drupal_add_css(drupal_get_path('theme', 'MYTHEME') . "/foo.css");
  }
}

MYMODULE을 모듈 이름으로 바꾸고 MYTHEME을 css 파일이 포함 된 테마 이름으로 바꾸십시오.


hook_init ()는 모든 페이지로드에서 실행되며 종종 여러 번 (AHAH) 실행됩니다. 왜 노드가 렌더링 될 때만 실행되는 hook_preprocess_node () (테마 또는 모듈)를 사용하지 않습니까?
— Decipher

좋은 지적은 init이 여러 번로드되었음을 몰랐습니다.
— Camsoft

해독기, 전처리 기능을 사용하도록 예제를 수정했습니다. 아직도 배우고 있습니다!
— Camsoft

노드 변수가 $ 통해 전달되는 꾸벅 꾸벅에 대한 사용 인수 (1) 다음 내 대답이 서로 다른 방법의 다음 질문으로 이어질 것이다 : 바르 왜 그런 다음 질문은 다음과 같습니다 P
— 해독

hook_preprocess_node () 문서를 읽어야한다고 생각합니다. 당신 말이 맞아요 epersonae, 나는 당신이 Decipher의 대답을 받아 들일 것을 제안합니다.
— Camsoft

7

CSS 스타일을 추가하는 기준이 노드의 일부 속성에 따라 달라지면 구현합니다 MYTHEME_preprocess_node(&$variables). 함수에 전달 된 값 중 하나는입니다 $variables['node'](이 아닌 것을 알 수 있습니다 $variables['#node']).

MYTHEME_preprocess_node(&$variables) {
  if ($variables['node']->nid == 3) {
    drupal_add_css(drupal_get_path('theme', 'MYTHEME') . "/foo.css");
  }
}

기준이 노드 속성에 의존하지 않으면 구현합니다 MYTHEME_preprocess_page(&$variables). $variables['node']표시되는 페이지가 노드 페이지 인 경우 노드 오브젝트를 포함합니다. Drupal 6에서는 프로세스 함수도를 얻지 $variables['is_front']만 Drupal 7에서는 동일한 변수가 전달되지 않습니다. 페이지가 첫 페이지인지 알아야하는 경우을 사용해야 drupal_is_front_page()합니다.

MYTHEME_preprocess_page(&$variables) {
  if ($variables['is_front']) {
    drupal_add_css(drupal_get_path('theme', 'MYTHEME') . "/foo.css");
  }
}

5

관리자 기반의 방법으로 CSS 모듈을 살펴볼 것 입니다. CSS 를 node/add및 node/edit페이지에 추가 할 수있는 필드를 추가 합니다.

CSS :

CSS 모듈은 충분한 권한과 활성화 된 노드가있는 사용자를 위해 노드 작성 페이지에 CSS 필드를 추가합니다.

사용자는 CSS 노드 필드에 CSS 규칙을 삽입 할 수 있으며 이러한 규칙은 노드보기에서 구문 분석됩니다.

이런 식으로 CSS 숙련 된 사용자는 노드 내용에 대한 복잡한 CSS 기반 디자인을 만들 수 있습니다.

중요 : CSS 편집 권한은 신뢰할 수있는 사용자 (관리자)에게만 제공되어야합니다. 이 권한이있는 악의적 인 사용자는 사이트 디자인을 손상시키고 보안 문제 (XSS)를 유발할 수 있습니다.


3

CodePerNode 는 훌륭하지만 CSS Injector 는 설치가 더 간단합니다 (라이브러리 필요 없음). 이 모듈을 사용하면 컨텐츠 관리자가 PHP 코드 나 INFO 파일을 전혀 건드리지 않고 특정 페이지에 CSS를 동적으로 추가 할 수 있습니다. 15777 설치는 잘못 될 수 없습니다. 이것은이 모듈이 작동한다는 사회적 증거입니다. CSS는 일반 캐싱 시스템과 함께 캐시됩니다.


2

이미 패널을 사용하고 있으므로 홈페이지 패널의 각 영역에 대해 CSS를 패널 스타일로 추가하는 것이 더 쉬울 수 있습니다. 여기에서 사용자 정의 마크 업을 정의하고 사이트 전체에서 재사용 할 수 있습니다.

홈페이지에 대한 페이지 관리자 변형 규칙의 일반 섹션으로 이동할 수도 있습니다. 현재 패널에만 CSS ID 및 규칙을 추가하기위한 섹션이 있습니다.

참고 : 이것은 모두 D7에 있으므로이 방법이 이전 버전보다 패널에서 더 잘 지원 될 수 있습니다.


2

/ * 컨텐츠 유형에 따라 CSS를 추가하기 위해 bartik 테마를 사용한 예제 * /

function bartik_preprocess_node(&$variables) {
if(!empty($variables['node'])) {
    if($variables['node']->type == 'my_custom_content_type')
    {
      drupal_add_css(drupal_get_path('theme', 'any_theme_name') . "/css/foo.css");   
    }
  }
  // Some other code here
}

2

이것을 'template.php'파일에 추가하십시오 :

function mytheme_preprocess_page (&$variables)
{
  if (drupal_is_front_page()) {
    drupal_add_css(drupal_get_path('theme','mytheme'). '/css/front.css');
  } 
}

'mytheme'을 테마 디렉토리 이름으로 바꾸고 '/css/front.css'를 CSS 파일이있는 경로로 바꾸십시오.

다른 페이지에서 'front.css'파일을 설정 해제하려면 'template.php'에 추가하십시오.

function hook_css_alter(&$css) {
  if (!drupal_is_front_page()) {
    unset($css[drupal_get_path('theme', 'mytheme') . '/css/front.css']);
  }
}

다시 'mytheme'을 테마 디렉토리 이름으로 바꾸십시오.

프론트 페이지에서 'styles.css'를 설정 해제해야하는 경우이 두 코드를 결합하십시오.

앞 페이지에 'styles.css'가없는 'front.css'가 필요하고 다른 모든 페이지에 'front.css'가없는 'style.css'가 필요하다고 가정합니다. 코드는 다음과 같습니다.

function mytheme_preprocess_page (&$variables)
{
  if (drupal_is_front_page()) {
    drupal_add_css(drupal_get_path('theme','mytheme'). '/css/front.css');
  } 
  else {
    drupal_add_css(drupal_get_path('theme','mytheme'). '/css/styles.css');
  }
}

function hook_css_alter(&$css) {
  if (drupal_is_front_page()) {
    unset($css[drupal_get_path('theme', 'mytheme') . '/css/styles.css']);
  }
  else {
    unset($css[drupal_get_path('theme', 'mytheme') . '/css/front.css']);
  } 
}

또한 'mytheme'을 교체하십시오.

도움이 되길 바랍니다.


마지막 코드는 내가 필요한 것입니다. 그리고 그것이 작동합니다. 즉, theme.info에서 stylesheets [all] [] = css / front.css를 제거한 후-나는 우리가 stylesheets [all] [] = css / styles와 함께 그것을 가지고 있어야한다고 잘못 추측했습니다. .css. 또한 page.tpl.php를 page--front.tpl.php로 재정의하기 때문에 작동하지 않을 수 있지만 모든 것이 잘 유지되는 것처럼 보입니다. 이것은 정말 도움이됩니다. 감사!
— Sd1

모든 사람이이 솔루션을 얻도록하십시오. theme.info 파일에서 styles.css (기본값) 및 front.css를 제거하십시오. 모든 캐시를 플러시하고 가야합니다.
— Sd1

1

template.php를 완전히 터치하지 않고 테마의 .info 파일에 다른 항목을 추가했습니다.

스타일 시트가에 있다고 가정하십시오 css/foo.css.

이것은 theme_name.info 파일의 모양입니다 :

name = Theme Name
...
stylesheets[all][] = css/foo.css

그런 다음 기본 스타일 시트와 함께 캐시하면 이점이 있으며, 이것이 홈페이지 용이라고 가정하기 때문에 의미가 있습니다.


물론 당신은 등 노드의 속성, 즉 꾸벅 꾸벅, 노드 유형에 따라 선택기를 평가해야 할 것
— 알렉산더 Hripak

이 접근 방식의 문제점은 CSS를 여기에 추가로이 사이트의 모든 페이지에 영향을 미칠 것입니다
— pal4life


0

본문 태그에서 페이지 노드를 인쇄 할 수 있습니다

<body page-node-26419 ...>

그럼 당신은 제한 할 수 있습니다

body.page-node-26419 {
    background: red
}

사소한 빠른 변경에 유용합니다


Drupal Answers에 오신 것을 환영합니다! 이 답변은 이미 Dave Reid가 제공했습니다.
— Kojo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.