template_preprocess_page ()를 사용하여 노드 유형에 따라 페이지 제목을 숨기는 방법


10

page.tpl.php현재 페이지가 1) 전체 디스플레이의 노드 (티저 모드와 반대)이고 2) 노드 유형이 concert 또는 bio 인 경우 현재 페이지의 제목을 숨기려고합니다 (에 의해 인쇄 됨 ) . 이러한 컨텐츠 유형의 노드 제목을 노드 컨텐츠에 직접 인쇄하므로 page.tpl.php로 인쇄 된 사본을 숨기고 싶습니다. 나는 이것을 page.tpl.php에서 직접 작동시킬 수 없으며, 내 독서는 전처리 및 프로세스 기능을 사용하여 template.php에서 템플릿 로직을 처리하는 것이 가장 좋습니다. 따라서을 사용하여 현재 페이지 제목 (위의 2 가지 조건)을 숨기려고합니다 template_preprocess_page(). 이것은 내 코드입니다.

<?php
    function MYTHEME_preprocess_page(&$variables) {
        if (!empty($variables['node']) && $variables['node']->type == 'concert') {
            hide($variables['title']);
        }
    }
?>

template.php에서 변수를 인쇄하기 위해 노드 유형을 어떻게 테스트합니까 ?를 읽었습니다 . 에 대한 문서 페이지 template_preprocess_page()및 기타 여러 사이트를 제공하지만이 기능이 제대로 작동하지 않는 것 같습니다. 난 당신이 호출 할 필요가 있다고 제안했다 isset()$variables['node']노드 유형에 대한 테스트하기 전에,하지만 그 중 하나가 작동하지 않았다. 나는 명확한 해결책을 어디에도 게시하지 못했고, 나는 재치가 끝났다.

답변:


9

내 독서는 전처리 및 프로세스 기능을 사용하여 template.php에서 템플릿 논리를 처리하는 것이 가장 좋은 방법이라고 제안합니다.

렌더링 코드에서 논리를 분리한다는 것은 단순히 template.php의 코드가 템플릿 파일에서 확인되는 변수를 설정한다는 것을 의미합니다. 이러한 방식으로 로직은 모두 template.php 파일에 포함되며 렌더링 코드는 모두 템플릿 파일에 포함됩니다.

template.php

function mytheme_preprocess_page(&$variables) {
  if (!empty($variables['node']) && $variables['node']->type == 'concert') {
    $variables['show_title'] = FALSE;
  }
}

page.tpl.php

<?php if ($show_title && $title): ?><h1 class="title" id="page-title"><?php print $title; ?></h1><?php endif; ?>

hide()$variables['title']렌더링 배열이 아닌 문자열 이기 때문에 작동하지 않습니다 . hide()는 항상 렌더링 배열과 함께 사용되며 문자열이에 전달 되더라도 문자열에는 영향을 미치지 않습니다 render().
실제로 hide()함수가이 코드를 사용하므로 문자열 (또는 배열을 포함하는 변수에 대한 참조가 아닌 값)을 전달 하면 PHP 오류가 발생합니다.

function hide(&$element) {
  $element['#printed'] = TRUE;
  return $element;
}

에서 페이지 제목을 가져 오듯이 $variables['title']with (와)을 설정 해제 unset($variables['title'])해도 작동하지 않습니다 .template_process_page()drupal_get_title()

if (!isset($variables['title'])) {
  $variables['title'] = drupal_get_title();
}

물론을 사용하여 실제 $title변수를 변경할 수도 있습니다 mytheme_process_page(&$variables) { $title = false; }.
RobW

4
@RobW mytheme_process_page(&$variables) { $variables['title'] = false; }는 BTW입니다.
Duncanmoo

이것에 대한 또 다른 메모; 테마가 포장되어 <?php print $title; ?>있는 한 <?php if (!$title_hidden): ?>간단하게 설정할 수 있습니다$variables['title_hidden'] = TRUE;
Duncanmoo

2

drupal_set_title ()을 사용하여이를 관리 할 수 ​​있습니다.

function mytheme_preprocess_page(&$vars){
    if (isset($vars['node']) && $vars['node']->type == 'news'){
        drupal_set_title('');
    }
}

이것은 나를 위해 작동하지 않았습니다. 다른 것이 무시 될 수 template_preprocess_page()있습니까? 테마 개발자 모듈을 사용하여 중복 페이지 제목을 검사하고에서 호출되고 있음을 확인했습니다 page.tpl.php. 제목을 삭제 page.tpl.php한 다음 원하는 위치에 다시 추가해야 template_preprocess_page()합니까? 예를 들어 페이지에 노드보기가 포함되어 있지만 페이지가 특정 유형 / 유형의 단일 노드 인 경우에는 제목을 렌더링하려고합니다.
diekunstderfuge

1
또한 화면 판독기를 사용하여 방문자로부터 중요한 정보를 제거 할 수 있습니다. 또한 사용자 탭에서 페이지 제목을 제거합니다. 처음부터 접근성을 생각하십시오.
Rick

1

if 조건이 맞다고 가정하여 이것을 시도하십시오 :)

 function MYTHEME_preprocess_page(&$variables) {
        if (!empty($variables['node']) && $variables['node']->type == 'concert') {
            unset($variables['title']);
        }
    }

작동하지 않습니다 : template_process_page ()$variables['title']에서 반환 된 값으로 설정 됩니다 drupal_get_title().
kiamlaluno

0

덜 복잡한 방법은 페이지에 이것을 인쇄하는 것입니다.

<?php hide($title); ?>

그러나 동적이기를 원한다면 preprocess_page다른 사람들이 제안한대로 사용하는 것이 좋습니다 .


1
작동하지 않습니다. hide()문자열이 아닌 배열 렌더링에 사용됩니다.
kiamlaluno

0

CSS에서 나는 이것을 테마로했다.

/*    Front Page - hide title  */
body.front header h1 {
 position: absolute; 
 left: -999em;    
}

http://www.alistapart.com/articles/now-you-see-me/에서 권장하는대로

왜? 당신은 여전히 ​​접근성을 위해 스크린 리더에 헤더와 h1을 'visible'시키길 원하기 때문입니다. 단순히 H1의 가치를 없애면 시각 장애인과 시력이 좋지 않은 방문객에게 중요한 정보를 빼앗기고 있습니다.


작동하지 않습니다. 왜? 프로그래밍 사이트 n의 도움없이 조건부 CSS를 추가 할 수 없기 때문에
AyeshK

Drupal은 위에서 사용한 'front'와 같은 요소에 클래스를 추가합니다. 나 자신을 위해 첫 페이지의 제목을 숨기고 화면 판독기에 '보이게'남겨 두어야합니다. 따라서 캐스 케이 딩 규칙의 논리를 사용하여 가시 사용자에게 숨겨야 할 시점과 그렇지 않은시기를 명확하게 정의 할 수 있습니다.
Rick

0

mytheme_preprocess_page 의 제안은 저에게 효과적이지만 사용 된 경우$vars['title_hidden'] = TRUE;

function mytheme_preprocess_page(&$vars) {
  if (isset($vars['node']->type) && $vars['node']->type == 'type') {
    $vars['title_hidden'] = TRUE;
  }
}

0

올바른 기능은

function mytheme_preprocess_node(&$vars) {
}

대신에

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