Hinzufügen einer CSS Klasse mittels Render Array

am 08.12.2013 - 11:25 Uhr in
Hi zusammen,
ich möchte gerne einigen HTML Standardelementen (h1, button, table, ...) feste Klassen zuweisen.
Hierzu habe ich die Funktion theme_html_tag
gefunden, mit der dies möglich sein soll:
https://api.drupal.org/api/drupal/includes!theme.inc/function/theme_html_tag/7
Leider bekomme ich es nicht hin, dies in mein Theme zu integrieren.
Verwende ich hierfür eine preprocess Funktion und wie müsste diese aussehen?
Könnte mir jemand mit einem Beispiel auf die Sprünge helfen?
Vielen Dank,
Andreas
- Anmelden oder Registrieren um Kommentare zu schreiben
Ich glaube, Du bringst da
am 08.12.2013 - 12:30 Uhr
Ich glaube, Du bringst da etwas durcheinander. Eine Theme-Funktion ist selbständig und braucht keine Preprozess-Funktion. Eine Theme-Funktion gibt Inhalte als HTML-Code aus, wobei dazu der Aufruf weiterer Theme-Funktionen ausgeführt werden kann.
Du baust diese Theming-Funktion in Deinem Theme ein, indem du die Funktion THEMENAME_html_tag in der template.php Deines Themes definierst (also die Funktion aus dem Core in die template.php kopieren und den Funktionsnamen ändern. Das Wort theme im Funktionsnamen wird durch den internen Namen Deines Themes ersetzt d.h. wie der .info-File heißt). Nachdem Du das getan hast, wird jeglicher HTML-Code in Deiner Funktion erstellt. Du kannst jetzt testen, was für ein Tag vorliegt, und entsprechende Klassen in die Ausgabe einbauen.
Beste Grüße
Werner
Hallo Werner,danke für die
am 08.12.2013 - 12:52 Uhr
Hallo Werner,
danke für die schnelle Antwort, ich glaube jetzt hab ich es etwas besser verstanden.
Irritierend für mich war, das in diesem Kommentar https://api.drupal.org/comment/49603#comment-49603 eine Preprocess function dafür verwendet wird.
Kannst Du mir sagen wie beispielsweise die Funktion
THEMENAME_html_tag
konkret aussehen müsste, wenn ich dem Tag<h1>
dauerhaftclass="ui header"
hinzufügen möchte?Danke schonmal im Voraus.
Andreas
Das ist jetzt ungetestet,
am 08.12.2013 - 13:12 Uhr
Das ist jetzt ungetestet, sollte aber etwa so aussehen:
<?php
function THEMENAME_html_tag($variables) {
$element = $variables['element'];
$attributes = isset($element['#attributes']) ? drupal_attributes($element['#attributes']) : '';
if ($element['#tag'] == "h1") {
$attributes['class'][] = 'ui-header';
}
if (!isset($element['#value'])) {
return '<' . $element['#tag'] . $attributes . " />\n";
}
else {
$output = '<' . $element['#tag'] . $attributes . '>';
if (isset($element['#value_prefix'])) {
$output .= $element['#value_prefix'];
}
$output .= $element['#value'];
if (isset($element['#value_suffix'])) {
$output .= $element['#value_suffix'];
}
$output .= '</' . $element['#tag'] . ">\n";
return $output;
}
}
?>
Denke daran, das Wort THEMENAME durch den Namen Deines Themes zu ersetzen.
Beste Grüße
Werner
edit: Der Name der Klasse kann kein Blank enthalten!!
Danke für das Beispiel.
am 09.12.2013 - 10:14 Uhr
Danke für das Beispiel. Leider bleibt es aber wirkungslos :-(
Kann es sein, das die Elemente, die direkt in den tpl.php Dateien stehen hiervon nicht betroffen sind oder noch Elemente dem Render Array hinzugefügt werden, nachdem die Funktion
html_tag
aufgerufen wurde?Oder kann man das evtl. mit irgendeiner process Funktion lösen, die erst ganz am Schluss aufgerufen wird?
Danke nochmals,
Andreas
Du mußt Dir klar machen, daß
am 09.12.2013 - 10:44 Uhr
Du mußt Dir klar machen, daß ein TPL-File die direkte Ausgabe der vorbereiteten Inhalte (die dazu in Variablen vorliegen) steuert. Da wird vielleicht noch mal irgendwo die render-Funktion aufgerufen, aber das, was Du direkt als HTML-Ausgabe im TPL-File einträgst, wird nirgendwo sonst mehr von Drupal verarbeitet. Da kann also diese Funktion auch nicht greifen. Da mußt Du die Klassen selbst in den HTML-Code setzen. Bei Views ist das ähnlich in den Teilen, bei denen Du beim Überschreiben eigenen HTML-Code einträgst. Auch der bleibt unverändert.
Beste Grüße
Werner
Okay, danke. Die TPL Dateien
am 09.12.2013 - 11:07 Uhr
Okay, danke. Die TPL Dateien kann ich dann ja einfach mittels search&replace im Texteditor modifizieren.
Trotzdem werden dem Render Array offenbar noch HTML Elemente hinzugefügt, nachdem die Funktion
html_tag
aufgerufen wird.Gibt es eine Möglichkeit, den Render Array ganz zum Schluss (also unmittelbar vor der Ausgabe) zu modifizieren?
Danke,
Andreas