Як приховати назву сторінки на основі типу вузла за допомогою template_preprocess_page ()


10

Я намагаюся приховати заголовок поточної сторінки (як надруковано page.tpl.php), якщо поточна сторінка - 1) вузол у повному режимі відображення (на відміну від режиму тизер), І 2) тип вузла - це концертний або біологічний . Я друкую заголовок вузла для цих типів вмісту безпосередньо у вмісті вузла, тому хочу приховати дублікат, який друкує page.tpl.php. Я не в змозі змусити це працювати безпосередньо у page.tpl.php, і моє читання пропонує найкращу практику обробляти логіку шаблону в template.php за допомогою функцій попередньої обробки та обробки. Отже, я намагаюся приховати поточну назву сторінки (з вищезазначеними двома умовами), використовуючи 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']з 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()? Я використовував модуль розробника тем для перевірки дублюючої назви сторінки та підтвердив, що вона викликається 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

Менш складний спосіб - це надрукувати це у вашій сторінці.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 додає класи до елементів, таких як "фронт", який використовується вище. Для себе мені потрібно сховати заголовок на першій сторінці, але залишити його «видимим» для читачів екрану. Тому я можу використовувати логіку каскадних правил, щоб чітко визначити, коли мені це потрібно приховано від прозорливих користувачів, а коли - ні.
Рік

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.