So verbergen Sie den Seitentitel basierend auf dem Knotentyp mithilfe von template_preprocess_page ()

10

Ich versuche, den Titel der aktuellen Seite (wie von gedruckt page.tpl.php) auszublenden, wenn die aktuelle Seite 1) ein Knoten in voller Anzeige (im Gegensatz zum Teaser-Modus) ist UND 2) der Knotentyp entweder Konzert oder Bio ist . Ich drucke den Knotentitel für diese Inhaltstypen direkt im Knoteninhalt, daher möchte ich das von page.tpl.php gedruckte Duplikat ausblenden. Ich bin nicht in der Lage, dies direkt in page.tpl.php zum Laufen zu bringen, und meine Lektüre legt nahe, dass die beste Vorgehensweise darin besteht, die Vorlagenlogik in template.php mithilfe von Vorverarbeitungs- und Prozessfunktionen zu behandeln. Also versuche ich, den aktuellen Seitentitel (mit den oben genannten 2 Bedingungen) mit auszublenden template_preprocess_page(). Das ist mein Code.

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

Ich lese Wie teste ich den Knotentyp, um eine Variable aus template.php zu drucken? und die Dokumentationsseite für template_preprocess_page()und verschiedene andere Websites, aber ich kann das einfach nicht zum Laufen bringen. Ich sah Hinweise darauf , dass Sie anrufen müssen isset()auf $variables['node']vor dem Test für den Knotentyp, aber das hat nicht funktioniert entweder. Ich habe nirgendwo eine klare Lösung gesehen und bin am Ende meines Witzes.

diekunstderfuge
quelle

Antworten:

9

und meine Lektüre legt nahe, dass die beste Vorgehensweise darin besteht, die Vorlagenlogik in template.php unter Verwendung von Vorprozess- und Prozessfunktionen zu behandeln.

Das Entkoppeln der Logik vom Rendering-Code bedeutet einfach, dass der Code in template.php eine Variable festlegt, die in der Vorlagendatei überprüft wird. Auf diese Weise ist die Logik vollständig in der Datei template.php enthalten, während sich der Rendercode vollständig in den Vorlagendateien befindet.

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()funktioniert nicht, weil $variables['title']es sich um eine Zeichenfolge handelt, nicht um ein Rendering-Array. hide()wird immer mit einem Rendering-Array verwendet und hat keine Auswirkung auf eine Zeichenfolge, auch wenn die Zeichenfolge an übergeben wird render().
Das Übergeben einer Zeichenfolge (oder eines beliebigen Werts, der nicht auf eine Variable verweist, die ein Array enthält) an hide()würde tatsächlich einen PHP-Fehler verursachen, da die Funktion diesen Code verwendet.

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

Das Deaktivieren $variables['title']mit unset($variables['title'])funktioniert auch nicht, da der Seitentitel template_process_page()von erhalten würde drupal_get_title().

if (!isset($variables['title'])) {
  $variables['title'] = drupal_get_title();
}
kiamlaluno
quelle
Natürlich können Sie auch die tatsächliche $titleVariable mit ändern mytheme_process_page(&$variables) { $title = false; }.
RobW
4
@RobW das wäre mytheme_process_page(&$variables) { $variables['title'] = false; }und das funktioniert übrigens.
Duncanmoo
Noch ein Hinweis dazu; solange Ihr Thema hüllt die <?php print $title; ?>in <?php if (!$title_hidden): ?>Sie können einfach eingestellt$variables['title_hidden'] = TRUE;
Duncanmoo
2

Sie können dies mit drupal_set_title () verwalten.

function mytheme_preprocess_page(&$vars){
    if (isset($vars['node']) && $vars['node']->type == 'news'){
        drupal_set_title('');
    }
}
mohit_rocks
quelle
Das hat bei mir nicht funktioniert. Könnte etwas anderes außer Kraft gesetzt werden template_preprocess_page()? Ich habe das Theme Developer-Modul verwendet, um den doppelten Seitentitel zu überprüfen und zu bestätigen, dass er von aufgerufen wird page.tpl.php. Sollte ich darüber nachdenken, den Titel zu löschen page.tpl.phpund ihn dann wieder dort hinzuzufügen, wo ich ihn verwenden möchte template_preprocess_page()? Ich möchte, dass der Titel beispielsweise gerendert wird, wenn die Seite eine Ansicht von Knoten enthält, aber nicht, wenn die Seite ein einzelner Knoten eines bestimmten Typs / bestimmter Typen ist.
Diekunstderfuge
1
Dies könnte auch wichtige Informationen von Besuchern mit Bildschirmleseprogrammen entfernen. Außerdem wird der Titel der Seite auf der Registerkarte "Benutzer" entfernt. Denken Sie von Anfang an an Barrierefreiheit.
Rick
1

Versuchen Sie dies unter der Annahme, dass Ihre if-Bedingung korrekt ist :)

 function MYTHEME_preprocess_page(&$variables) {
        if (!empty($variables['node']) && $variables['node']->type == 'concert') {
            unset($variables['title']);
        }
    }
junedkazi
quelle
Es funktioniert nicht: template_process_page () würde $variables['title']mit dem von zurückgegebenen Wert gesetzt drupal_get_title().
Kiamlaluno
0

Weniger kompliziert ist es, dies in Ihrer page.tpl.php auszudrucken

<?php hide($title); ?>

Aber wenn Sie möchten, dass es dynamisch ist, würde ich vorschlagen, das zu verwenden, preprocess_pagewie von anderen vorgeschlagen.

Ninjascorner
quelle
1
Es funktioniert nicht. hide()wird beim Rendern von Arrays verwendet, nicht von Zeichenfolgen.
Kiamlaluno
0

In CSS habe ich dies mit meinem Thema gemacht

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

Wie von http://www.alistapart.com/articles/now-you-see-me/ empfohlen

Warum? Weil Sie immer noch den Header und h1 "sichtbar" haben möchten, um die Lesegeräte auf Barrierefreiheit zu überprüfen. Wenn Sie einfach den Wert des H1 entfernen, rauben Sie Ihren blinden und sehbehinderten Besuchern einige potenziell wichtige Informationen.

Rick
quelle
Dies wird nicht funktionieren. Warum? Weil Sie bedingtes CSS nicht ohne Hilfe von Programmierseite n
AyeshK
Drupal fügt Klassen wie den oben verwendeten 'Front' Klassen hinzu. Für mich selbst muss ich den Titel auf der Titelseite ausblenden, ihn aber für Bildschirmleser "sichtbar" lassen. Daher kann ich die Logik der Kaskadierung von Regeln verwenden, um klar zu definieren, wann ich sie vor sehenden Benutzern verstecken muss und wann nicht.
Rick
0

Der Vorschlag von mytheme_preprocess_page funktioniert bei mir aber wenn verwendet wird$vars['title_hidden'] = TRUE;

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

Die richtige Funktion ist

function mytheme_preprocess_node(&$vars) {
}

anstatt

function mytheme_preprocess_page(&$vars) {
}
Paolo Marcolli
quelle