Best Practises bestehendes Theme/CSS überschreiben
am 14.07.2016 - 20:04 Uhr in
Hallo zusammen,
derzeit bin ich neu in der Drupal Entwicklug und lese mich gerade in Modul und Theme Entwicklung ein.
Da ein bestehendes Theme angepasst werden soll suche ich jetzt nach einem weg ein bestehendes Themes zu erweitern.
Beim erweitern des/der Themes bin ich zu dem Entschluss gekommen, dass es am effektivsten wäre, um die Updatefähigkeit, Flexibilität und ggfs. um Troubleshooting
des Themes zu gewährleisten, CSS Änderungen in ein Modul auszulagern. Was mir auch gelungen ist.
So kann jederzeit geprüft werden ob der Fehler auf das Modul(mein CSS) zurückzuführen ist, oder ob es am Theme, bzw. möglicherweise auch an einem anderen Modul liegt.
(ich werfe jetzt mal Superfish in den Raum)
Ein paar Probleme dieser Ausführung habe ich jetzt schon mitbekommen
- es werden auch Styles im Backend Theme überschrieben X(
- man kann sich nicht aussuchen an welcher Stelle das Theme geladen werden soll, sodass man zumeist mit der !important Regel arbeiten muss
Jetzt meine Frage ;)
Gibt es eine Möglichkeit herauszufinden ob mein Theme gerade als Backend oder als Frontent Theme verwendet wird?
Es geht mir vorrangig um eine saubere Struktur in die HTML Tags zu bekommen(Input, H1, etc)
Oder besser wie würdet Ihr in diesem Fall vorgehen?
Den HTML Code des Entwicklers anpacken und den CSS Link zusätzlich hart in die page.tpl Codieren?
schon mal Danke vorab
Verdächtiger255
Kurze Sammlung von Informationen die mir weitergeholfen haben:
Vor-/Nachteile CSS+ Javascript in Drupal laden(Englisch)
Styles via Modul nachladen
- Anmelden oder Registrieren um Kommentare zu schreiben
zwei Grundsätze, die dir viel Ärger ersparen können
am 15.07.2016 - 05:00 Uhr
ändere niemals etwas in Originaldateien - NIEMALS.
Du kannst eine Kopie von einem Theme machen, diese umbenenen, entsprechend musst du ein paar Einträge ändern, und dann kannst du dies bearbeiten.
Oder du bildest ein Subtheme von einem bestehende Theme, und schreibst nur für die Dinge, die du anders haben möchtest, eine CSS (die nennt man überschreiben, weil es praktisch den Wert überschreibt), oder eben auch ein individuelles Template.
Wie gesagt, du darfst kopieren, und Änderungen in der Kopie vornehmen.
Drupal kaskadiert - zuerst wird versucht es eine Einstellung in deinem Theme zu finden, dann wird im Basistheme deines Themes geschaut, und dann im Core.
Was zuerst gefunden wird, hat gewonnen.
Die Lösung mit dem Subtheme,
am 15.07.2016 - 06:03 Uhr
Die Lösung mit dem Subtheme, die Ronald nennt, ist besser als ein Modul.
Welches Theme verwendest Du?
Theme der Wahl ist das Bootstrap Business Theme
am 16.07.2016 - 12:45 Uhr
Der Hauptgrund für mich war ein Theme zu finden das wirklich responsive war und, meinen (XD) Ansprüchen standhalten konnte.
http://www.morethanthemes.com/
Warum ist ein Subtheme besser? Bitte entschuldigt das ich so dreiste Frage?
Und im gewissen Sinne ändere ich ja trotz dessen die Oginaldateien, nur eben in einem Unterordner, d.h. aber auch das ich wenn das Theme aktualisiere alle Anpassungen neu gemacht werden müssen (also z.B. die Style CSS drüber kopieren)
Grüße verdaechtiger 255
Du kannst in Deinem Modul
am 16.07.2016 - 12:47 Uhr
Du kannst in Deinem Modul schon auch bestimmen wo ein CSS File geladen wird.
Du kannst z. B. auch eine preprocess-Funktion in Deinem Modul benutzen und dort CSS z. B. via drupal_add_css (hier kann man auch bestimmen wo das CSS landet, Stichwort group und weight) laden, das könntest Du dann mit Drupal path_is_admin() auch so steuern dass es nur im Admin-Bereich oder nicht im Admin-Bereich geladen wird.
Mit hook_css_alter kannst Du ggf. auch eine CSS-Datei komplett ersetzen und mit Deiner eigenen Datei ersetzen.
Wenn Du wirklich nur eine einzelne CSS-Datei zusätzlich einbinden willst, kannst Du das auch einfach in der theme.info über stylesheets[] machen. Das ist auch vertretbar ohne ein Subtheme zu erstellen, da Du ja Deine Änderungen nur in diesem einen CSS-File hast. Je nachdem wie das Theme implementiert ist kann das Anlegen eines Subthemes nämlich schon etwas aufwändiger sein.
Links:
https://api.drupal.org/api/drupal/includes%21common.inc/function/drupal_add_css/7.x
https://api.drupal.org/api/drupal/includes!path.inc/function/path_is_admin/7.x
https://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_css_alter/7.x
Preprocess z. B. https://api.drupal.org/api/drupal/includes%21theme.inc/function/template_preprocess_page/7.x
Wenn Du ein Subtheme hast, in
am 16.07.2016 - 13:21 Uhr
Wenn Du ein Subtheme hast, in dem eigene CSS-Styles oder Funktionen in der template.php geschrieben wurde oder sonstige Template-Dateien abgelegt wurden, dann kannst Du das Original-Theme blindlings durch eine aktuelle Datei ersetzen. Denen in Deinem Sub-Theme passiert dann nichts.
In dem Fall, den Stefan beschreibt (nur eine CSS-Datei) ist es vielleicht nicht nötig.
Aber ich finde es einfach sauberer.
Beispiel: Ich habe gerade eine Anfrage für Support einer Drupal-Seite bekommen.
Die wurde gehackt. Dabei wurden auch DAteien des Themes verändert.
Leider hat der Vorgänger kein Subtheme erstellt, sondern ein paar Änderungen im Theme direkt gemacht.
Doku gibts natürlich nicht.
Jetzt muß man sehr vorsichtig untersuchen, welche Änderungen gewollt sind und in die saubere Installation übernommen werden müssen und welches Hacking Änderungen sind.
Wäre das sauber getrennt, könnte ich das gehackte Parent-Theme einfach wegwerfen und neu installieren.
Vielen Dank an euch alle für
am 17.07.2016 - 21:38 Uhr
Vielen Dank an euch alle für euere tatkräftige Unterstützung. Das Thema Subthemes schau ich mir im Detail noch mal an.
Da ich wie schon beschrieben lediglich ein CSS File nachladen werde, habe ich jetzt (durch den Tipp von Stefan mit dem Admin Path) jetzt die aktuelle Implementierung vorgenommen.
Javascript seitige Unterscheidung(Admin Path), könnte man Beispielsweise über die body Classes (front, not-front) machen, das hatte ich beim Suchen noch rausbekommen.
Vielleicht wird das auch mal benötigt:
.module
function <meinmodulname>_init(){
$modulename='<meinmodulname>';
if (!path_is_admin(current_path())) {
drupal_add_css(drupal_get_path('module', $modulename) . '/'. $modulename . '.css', array('group' => CSS_DEFAULT, 'weight' => 100, 'every_page' => TRUE));
}
}
meinmodulname.info
name = <meinmodulname>
description = "Schaltet die angepassten Änderungen des Standard Themes zu"
core = 7.x
version = 1.0
Danke
verdaechtiger255