Problem beim Schreiben einer eigenen Templatedatei
Eingetragen von AndréLebrun (5)
am 29.03.2018 - 13:40 Uhr in
am 29.03.2018 - 13:40 Uhr in
Ich habe bartik als Haupttheme gesetzt und bin gerade dabei, css und templating zu lernen. Ich habe gesehen, dass es eine Datei /var/www/html/themes/bartik/template.php gibt, und nun ist mir folgendes Ziel vorgeschwebt. Ich wollte nun für node3 ein eigenes css wie folgt erstellen:
<?php
/**
* Add body classes if certain regions have content.
*/
function bartik_preprocess_html(&$variables) {
if (!empty($variables['page']['featured'])) {
$variables['classes_array'][] = 'featured';
}
if (!empty($variables['page']['triptych_first'])
|| !empty($variables['page']['triptych_middle'])
|| !empty($variables['page']['triptych_last'])) {
$variables['classes_array'][] = 'triptych';
}
if (!empty($variables['page']['footer_firstcolumn'])
|| !empty($variables['page']['footer_secondcolumn'])
|| !empty($variables['page']['footer_thirdcolumn'])
|| !empty($variables['page']['footer_fourthcolumn'])) {
$variables['classes_array'][] = 'footer-columns';
}
drupal_add_css(path_to_theme() . '/css/ie.css', array('group' => CSS_THEME, 'browsers' => array('IE' => 'lte IE 7', '!IE' => FALSE), 'preprocess' => FALSE));
drupal_add_css(path_to_theme() . '/css/ie6.css', array('group' => CSS_THEME, 'browsers' => array('IE' => 'IE 6', '!IE' => FALSE), 'preprocess' => FALSE));
// Hier wollte ich auf meinen node zugreifen sowie auf meine css...
if ($variables['node']->nid == 3) {
drupal_add_css(path_to_theme() . '/css/node3.css');
}
}
?>
Das Problem ist, dass sich, wenn ich den node3 ansteuere nichts von den Effekten meines "custom" css bemerkbar macht, dafür bekomme ich aber folgenden Fehler:
Notice: Undefined index: node in bartik_preprocess_html() (line 29 of /var/www/html/themes/bartik/template.php).
Notice: Trying to get property of non-object in bartik_preprocess_html() (line 29 of /var/www/html/themes/bartik/template.php).
Wie soll ich auf die node-id zugreifen, wenn nicht mit dem -> Operator?
- Anmelden oder Registrieren um Kommentare zu schreiben
Zunächst versuche dich in
am 29.03.2018 - 13:51 Uhr
Zunächst versuche dich in Subthemes einzulesen. Änderungen wie deine ändern die Core-Dateien, die bei einem Update von Drupal überschrieben werden würden. Du kannst jedoch ein eigenes Subtheme definieren, das als Basis ein beliebiges anderes, in deinem Fall Bartik nutzt.
Die Ursache deiner Fehlermeldung besteht darin, dass die preprocess_html() Funktion für jede Seite aufgerufen wird. Nicht auf jeder Seite wird $variables['node'] zur Verfügung stehen, da nicht jede Seite ein Node representiert. Hier musst du etwas vorsichtiger agieren.
Was du in der preprocess_html() beispielsweise machen kannst wäre folgendes
<?php
if ($node = menu_get_object()) {
if ($node->nid == 3) {
drupal_add_css(path_to_theme() . '/css/node3.css');
}
}
?>
Hierbei wird versucht das Node der gerade geöffneten Seite zu laden (aus dem Cache, wenn schon einmal abgefragt). Wenn es vorhanden ist prüfst du noch auf die entsprechende nid und fügst die CSS hinzu.
Du kannst jedoch auch statt mytheme_preprocess_html(&$variables) die Funktion mytheme_preprocess_node(&$variables) für das Theme implementieren. Diese wird nur für Nodes aufgerufen und das Objekt würde immer zur Verfügung stehen. Hier kommt es aber darauf an, ob du die CSS für jedes Einbinden des Nodes nutzen möchtest, z.B. auch Listenansichten oder nur für die einzelne Node-Seite.
Ich habe mich nun in
am 31.03.2018 - 13:59 Uhr
Ich habe mich nun in subtheming eingelesen, stehe bei einer Sache aber noch ein bisschen auf dem Schlauch. Ich habe unter sites/all/themes ein subtheme erstellt.
Ich habe in meinem subtheme einen css-Ordner angelegt, da ich den Colorpicker zum laufen bekommen wollte, und auch style.css habe ich überschrieben, hier der Beginnn der info-Datei:
name = mysubtheme
description = A flexible, recolorable theme with many regions.
base theme = bartik
package = Core
version = VERSION
core = 7.x
stylesheets[all][] = css/style.css
stylesheets[all][] = css/colors.css
Das funktioniert auch soweit. Ich habe überdies in der template.php-Datei meines subtheme alle Funktionen meines Basethemes überschrieben, die Datei beginnt wie folgt:
<?php
/**
* Add body classes if certain regions have content.
*/
function mysubtheme_preprocess_html(&$variables) {
if (!empty($variables['page']['featured'])) {
$variables['classes_array'][] = 'featured';
}
if (!empty($variables['page']['triptych_first'])
|| !empty($variables['page']['triptych_middle'])
|| !empty($variables['page']['triptych_last'])) {
$variables['classes_array'][] = 'triptych';
}
if (!empty($variables['page']['footer_firstcolumn'])
|| !empty($variables['page']['footer_secondcolumn'])
|| !empty($variables['page']['footer_thirdcolumn'])
|| !empty($variables['page']['footer_fourthcolumn'])) {
$variables['classes_array'][] = 'footer-columns';
}
// Add conditional stylesheets for IE
drupal_add_css(path_to_theme() . '/css/ie.css', array('group' => CSS_THEME, 'browsers' => array('IE' => 'lte IE 7', '!IE' => FALSE), 'preprocess' => FALSE));
drupal_add_css(path_to_theme() . '/css/ie6.css', array('group' => CSS_THEME, 'browsers' => array('IE' => 'IE 6', '!IE' => FALSE), 'preprocess' => FALSE));
if ($node = menu_get_object()) {
if ($node->nid == 3) {
drupal_add_css(path_to_theme() . '/css/node3.css');
}
}
}
?>
Ich habe content mit der Node id==3, das habe ich verifiziert. Ich habe in dem css-Ordner meines Subtheme eben die node3.css, mit welcher ich bezwecken wollte, dass eben der gesamte body mit einem Hintergrndbild hinterlegt wird, der Gesamtinhalt der Datei ist dieser:
body {
background-image: url("./sites/all/themes/mysubthemepixxx/water.jpg");
background-repeat: no-repeat;
}
Bin ich auf dem Holzweg oder wieso übernimmt er das nicht?
if ($node =
am 01.04.2018 - 05:31 Uhr
if ($node = menu_get_object()) {
ist glaube ich falsch
C.A.W. Webdesign
@caw:Es ist zwar seh
am 10.04.2018 - 16:32 Uhr
@caw:
Es ist zwar sehr umstritten, ob man so etwas machen sollte, da es halt eine potentielle Fehlerquelle darstellt, die sehr schwer zu finden ist.
Aber syntaktisch und logisch ist es korrekt - Es wird ein Objekt abgeholt und gleichzeittig überprüft ob überhaupt ein gültiges Objekt oder NULL zurück geliefert wird.
@topic:
Ich würde Dir ja empfehlen dich erst mal systematisch in Drupal einzuarbeiten. Auf mich wirkt das hier so, als ob Du zunächst Drupal installiert hast und jetzt mal guckst wo Du den Code modifizieren kannst. Das ist eine Vorgehensweise wie man sie offt bei WP antriff. das führt bei Drupal aber garantiert in eine Sackgasse.
Wenn Du keine Bücher magst schau halt mal in die online Doku zu Drupal (aufgrund der TPL-Datein bist Du wohl mit D7 beschäftigt).
Hier wird das Template-System beschrieben: https://www.drupal.org/node/1089656
@und noch zur Frage:
body {
background-image: url("./sites/all/themes/mysubthemepixxx/water.jpg");
background-repeat: no-repeat;
}
Der Pfad zu dem Image ist relativ zum root. Dein CSS liegt aber mit Sicherheit nicht im root.
LG
Peter
ein guter Anfang ist,
am 10.04.2018 - 09:12 Uhr
du holst dir das Theme "ZEN", das hervorragend dokumentiert ist, machst eine Kopie davon, die du nach Drupalvorgaben individualisierst und nach eigenem Gutdünken umbenennst.
Daraus machst du dein eigenes Theme.
Da in ZEN alles sehr ausführlich dokumentiert ist, wirst du schnell erfolgreich werden und das Theming verstehen lernen.
Grüße
Ronald
Vielen Dank für die Tipps,
am 10.04.2018 - 16:30 Uhr
Vielen Dank für die Tipps, sie haben mir sehr geholfen.