Как скрыть заголовок страницы в зависимости от типа узла, используя template_preprocess_page ()


10

Я пытаюсь скрыть заголовок текущей страницы (как напечатано page.tpl.php), если текущей страницей является 1) узел в полноэкранном режиме (в отличие от тизерного режима), И 2) тип узла - концертный или био . Я печатаю заголовок узла для этих типов содержимого непосредственно в содержимом узла, поэтому я хочу скрыть дубликат, печатаемый с помощью 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 с использованием функций preprocess и process.

Отделение логики от кода рендеринга просто означает, что код в 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']с помощью 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.
Дунканму

Еще одно замечание по этому поводу; до тех пор , как ваша тема обертывания <?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()? Я использовал модуль Theme Developer для проверки дубликата заголовка страницы и подтвердил, что он вызывается page.tpl.php. Должен ли я подумать об удалении заголовка, page.tpl.phpа затем ДОБАВИТЬ его туда, где я хочу его использовать template_preprocess_page()? Я хочу, чтобы заголовок отображался, например, когда страница содержит представление узлов, но не когда страница является отдельным узлом определенного типа / типов.
diekunstderfuge

1
Это также может лишить посетителей важной информации с помощью программ чтения с экрана. Он также удаляет заголовок страницы на вкладке пользователей. Подумайте о доступности с самого начала.
Рик

1

Попробуйте это при условии, что ваше условие корректно :)

 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

Менее сложным способом является печать этого в вашем page.tpl.php

<?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 «видимым» для программ чтения с экрана для обеспечения доступности. Если вы просто лишите значение H1, вы лишите своих слепых и слабовидящих посетителей потенциально важной информации.


Так не пойдет. Почему? Потому что вы не можете добавить условный CSS без помощи сайта программирования n
AyeshK

Drupal добавляет классы к таким элементам, как 'front', использованным выше. Для себя мне нужно скрыть заголовок на первой странице, но оставить его «видимым» для программ чтения с экрана. Поэтому я могу использовать логику каскадных правил, чтобы четко определить, когда мне нужно скрыть их от зрячих пользователей, а когда нет.
Рик

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;
  }
}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.