단일 페이지 / 노드에 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.phppage.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 모듈을 살펴볼 것 입니다. CSSnode/addnode/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.