Jak ukryć tytuł strony na podstawie typu węzła za pomocą template_preprocess_page ()

10

Próbuję ukryć tytuł bieżącej strony (wydrukowany przez page.tpl.php), jeśli bieżąca strona to 1) węzeł na pełnym ekranie (w przeciwieństwie do trybu zwiastuna) ORAZ 2) typ węzła to koncert lub biografia . Drukuję tytuł węzła dla tych typów treści bezpośrednio w treści węzła, więc chcę ukryć duplikat drukowany przez page.tpl.php. Nie jestem w stanie sprawić, aby działało to bezpośrednio w page.tpl.php, a moje czytanie sugeruje, że najlepszą praktyką jest obsługa logiki szablonów w template.php przy użyciu funkcji wstępnego przetwarzania i procesów. Próbuję więc ukryć bieżący tytuł strony (z powyższymi 2 warunkami) przy użyciu template_preprocess_page(). To jest mój kod.

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

Przeczytałem Jak przetestować typ węzła, aby wydrukować zmienną z template.php? oraz stronę z dokumentacją dla template_preprocess_page()różnych witryn, ale nie mogę tego zrobić. Widziałem sugestie, że trzeba zadzwonić isset()na $variables['node']przed badaniem dla typu węzła, ale to nie działało. Nigdzie nie widziałem przejrzystego rozwiązania i jestem na ukończeniu.

diekunstderfuge
źródło

Odpowiedzi:

9

a moje czytanie sugeruje, że najlepszą praktyką jest obsługa logiki szablonów w template.php przy użyciu funkcji wstępnego przetwarzania i funkcji.

Oddzielenie logiki od kodu renderowania oznacza po prostu, że kod w template.php ustawia zmienną sprawdzaną w pliku szablonu. W ten sposób cała logika jest zawarta w pliku template.php, a kod renderujący w plikach szablonów.

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()nie działa, ponieważ $variables['title']jest łańcuchem, a nie tablicą renderującą. hide()jest zawsze używany z tablicą renderującą i nie ma żadnego efektu z łańcuchem, nawet gdy łańcuch jest przekazywany render().
W rzeczywistości przekazanie ciągu (lub dowolnej wartości, która nie jest odwołaniem do zmiennej zawierającej tablicę) hide()spowoduje błąd PHP, ponieważ funkcja używa tego kodu.

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

Rozbrojenie za $variables['title']pomocą unset($variables['title'])również nie działa, ponieważ pobierałby template_process_page()tytuł strony drupal_get_title().

if (!isset($variables['title'])) {
  $variables['title'] = drupal_get_title();
}
kiamlaluno
źródło
Oczywiście możesz również zmienić rzeczywistą $titlezmienną za pomocą mytheme_process_page(&$variables) { $title = false; }.
RobW,
4
@RobW to byłoby mytheme_process_page(&$variables) { $variables['title'] = false; }i to działa BTW.
Duncanmoo,
Kolejna uwaga na ten temat; tak długo, jak długo twój motyw się <?php print $title; ?>w nim <?php if (!$title_hidden): ?>$variables['title_hidden'] = TRUE;
włączy
2

Możesz zarządzać tym za pomocą drupal_set_title ().

function mytheme_preprocess_page(&$vars){
    if (isset($vars['node']) && $vars['node']->type == 'news'){
        drupal_set_title('');
    }
}
mohit_rocks
źródło
To nie działało dla mnie. Czy coś innego może być nadrzędne template_preprocess_page()? Użyłem modułu Theme Developer do sprawdzenia duplikatu tytułu strony i potwierdziłem, że jest on wywoływany page.tpl.php. Czy powinienem pomyśleć o usunięciu tytułu, page.tpl.phpa następnie DODAJ go tam, gdzie chcę go użyć template_preprocess_page()? Chcę, aby tytuł był renderowany, na przykład, gdy strona zawiera widok węzłów, ale nie wtedy, gdy strona jest pojedynczym węzłem określonego typu / typów.
diekunstderfuge
1
Może to również pozbawić użytkowników ważnych informacji za pomocą czytników ekranu. Usuwa również tytuł strony na karcie użytkowników. Pomyśl o dostępności od samego początku.
Rick,
1

Spróbuj, zakładając, że twój warunek jest poprawny :)

 function MYTHEME_preprocess_page(&$variables) {
        if (!empty($variables['node']) && $variables['node']->type == 'concert') {
            unset($variables['title']);
        }
    }
junedkazi
źródło
To nie działa: szablon_process_page () ustawiłby $variables['title']wartość zwracaną z drupal_get_title().
kiamlaluno
0

Mniej skomplikowanym sposobem jest wydrukowanie tego na page.tpl.php

<?php hide($title); ?>

Ale jeśli chcesz, aby był dynamiczny, sugerowałbym użycie tego, preprocess_pageco sugerują inni.

ninjascorner
źródło
1
To nie działa hide()jest używany do renderowania tablic, a nie ciągów.
kiamlaluno
0

W CSS zrobiłem to z moim motywem

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

Zgodnie z zaleceniami http://www.alistapart.com/articles/now-you-see-me/

Dlaczego? Ponieważ nadal chcesz mieć nagłówek i h1 „widoczne” dla czytników ekranu dla ułatwienia dostępu. Jeśli po prostu pozbędziesz się wartości H1, okradniesz niewidomych i słabo widzących gości z niektórych potencjalnie ważnych informacji.

Stóg
źródło
To nie zadziała. Dlaczego? Ponieważ nie można dodać warunkowego CSS bez pomocy ze strony programowania n
AyeshK,
Drupal dodaje klasy do elementów takich jak „przód” używanych powyżej. Dla siebie muszę ukryć tytuł na pierwszej stronie, ale pozostawić „widoczny” dla czytników ekranu. Dlatego mogę użyć logiki reguł kaskadowych, aby jasno określić, kiedy potrzebuję go ukryć przed widzącymi użytkownikami, a kiedy nie.
Rick,
0

sugestia mytheme_preprocess_page działa dla mnie, ale jeśli jest używana$vars['title_hidden'] = TRUE;

function mytheme_preprocess_page(&$vars) {
  if (isset($vars['node']->type) && $vars['node']->type == 'type') {
    $vars['title_hidden'] = TRUE;
  }
}
cigotete
źródło
0

Prawidłowa funkcja to

function mytheme_preprocess_node(&$vars) {
}

zamiast

function mytheme_preprocess_page(&$vars) {
}
Paolo Marcolli
źródło