Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Allgemeines zu Drupal ›

Seltsames Verhalten der Hooks css_alter

Eingetragen von qb (140)
am 29.10.2015 - 13:20 Uhr in
  • Allgemeines zu Drupal
  • Drupal 7.x

Hallöchen,

ich möchte einen CSS-Pfad korrigieren bevor dieser in den Header-Ausgegeben wird. Der dazu passende Hook ist wohl hook_css_alter( &$css ).

Da ich die Änderung global in all meinen Seiten aktivieren möchte, habe ich den entsprechden Hook eines (eigenen) Moduls welches ich in allen Themes einsetzte, entsprechend erweiter. Die Funktionaltität wird in dem Modul-Hook auch durchgeführt, geht aber scheinbar komplett verloren. Erst wenn ich den entsprechenden Hook direkt im Theme einbaue und hier den seleben Code einfüge greift die Änderung.
Anders ausgedrückt: Der Hook des Modules modifiziert das CSS-Array, lasse ich dieses zur Kontrolle erneut im Theme-Hook ausgeben enthält es das original Eingangs-Array (daher keine Modifikationen).

So sieht der Code zu den Hook-Funktionen aus:

function MODULE_css_alter( &$css )
{
    foreach ($css as $key => $value) {
        if ($value['type'] === 'external') {
            $css[$key]['data'] = str_replace(array('|'),array('%7C'),$css[$key]['data']);
        }
    }
   
    // An dieser Stelle ist das Array definitiv so aufgebaut wie es gewuenscht wird!
}

.
.
.

function THEME_css_alter( &$css )
{
    // Hier sind die zuvor im Module-Hook vorgenommenen Aenderungen nicht mehr vorhanden
    
    foreach ($css as $key => $value) {
        if ($value['type'] === 'external') {
            $css[$key]['data'] = str_replace(array('|'),array('%7C'),$css[$key]['data']);
        }
    }

}

Die beiden Hooks werden definitv ausgeführt und zwar in der oben angegebenen Reihenfolge.
Auch ein deutlich komplexerer Umbau des CSS-Arrays (inkl. unset oder clone) bringt nichts.

Da ich hier den Pfad des CSS ('data') ändere, habe ich das Array schon entsprechend umgebaut, so dass anschliessend nur noch der korrekte Eintrag vorhanden ist:

[http://fonts.googleapis.com/css?family=Open+Sans:600,regular%7COpen+Sans+Condensed:300%7COswald:700%7CRoboto:500,700&subset=latin] => Array
(
                    [type] => external
                    [group] => 100
                    [weight] => 0.019
                    [every_page] =>
                    [media] => all
                    [preprocess] => 1
                    [data] => http://fonts.googleapis.com/css?family=Open+Sans:600,regular%7COpen+Sans...
                    [browsers] => Array
                        (
                            [IE] => 1
                            [!IE] => 1
                        )

)

Mein Problem besteht also darin, dass THEME_css_alter() immer wieder das original Array reingereicht bekommt.

Alle anderen Modifikationen der CSS im Hook des Modules greifen jedoch. Also alles der Form:

     $css = drupal_add_css( .... )
kommt sauber im Theme an.

Frage: Hat noch jemand ein Idee woran es liegen kann?

Danke (:-

‹ CKeditor Textarea verschwindet Seltsames Verhalten der Hooks css_alter ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

Das ist vermutlich eine Frage

Eingetragen von wla (9037)
am 29.10.2015 - 14:46 Uhr

Das ist vermutlich eine Frage der Gewichtung. Die Module werden alphabetisch durchlaufen, sofern sie das gleiche Gewicht haben. Wenn Du also den Pfad änderst und ein späteres Modul ihn wieder zurück setzt, kann das natürlich nicht gehen. Das Theme wird immer nach den Modulen angesprungen und dort würde ich die Änderung auch plazieren.

.
Werner
drupal-in-duesseldorf.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *

  • Anmelden oder Registrieren um Kommentare zu schreiben

Die Module werden in

Eingetragen von qb (140)
am 29.10.2015 - 15:56 Uhr

Die Module werden in passenden Reihenfolge durchlaufen. Das hab ich ja beschrieben, dass zunächst die Hook-Funktion des Modules und dann die Hook-Funktion des Themes angesteuert wird.
In der Hook-Funktion des Modules wird zunächst eine Änderung durchgeführt (an der per Ref übergebenen Variable), diese Änderung kommt aber in der danach ausgeführten Hook_funktion des Themes nicht mehr an.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Die eine Frage ist ob es noch

Eingetragen von Stefan.Korn (286)
am 29.10.2015 - 16:47 Uhr

Die eine Frage ist ob es noch weitere Module außer Deinem gibt die hook_css_alter ansprechen und ob diese ggf. nach Deinem Modul zur Ausführung kommen

Die andere Frage ist warum Du die Änderung nicht gleich im Theme statt im Modul vornimmst wenn Sie dort greift

  • Anmelden oder Registrieren um Kommentare zu schreiben

Keines (meiner) anderen

Eingetragen von qb (140)
am 29.10.2015 - 18:14 Uhr

Keines (meiner) anderen Module macht die genannte Änderung Rückgängig.

Ich kann natürlich das Code-Schnippsel immer in das jeweilige Theme kopieren. Das wiederstrebt mir aber, den ich möchte derartige Dinge gerne Zentral in einem meiner Core-Module durchführen. Dadurch deploy ich diese Änderungen automatisch auf alle von mir betreuten Webseiten, ohne jedes Theme einzeln anpacken zu müssen.

Ergänzend zu meiner ersten Beschreibung:
Ich hatte ein ähnliches Problem beim D7-Core schon einmal. Damals hing es, an dem per Value übergebenen Parameter.
Ich hab das hier so ausführlich gepostet, weil ich hoffte das evtl. jemandem etwas in dem Zusammenhang auffällt.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Welches Modul bringt denn

Eingetragen von Stefan.Korn (286)
am 29.10.2015 - 18:03 Uhr

Welches Modul bringt denn dieses CSS ein, das Du ändern willst?

  • Anmelden oder Registrieren um Kommentare zu schreiben

Modul = fontyourface

Eingetragen von qb (140)
am 29.10.2015 - 18:12 Uhr

Modul = fontyourface

Und das baut den URL Parameter zum Pullen der Fonts von Google-Font so zusammen, das er nicht HTML5 komform ist.
Die Browser kommen damit klar. Aber es ist eine Unschönheit im HTML-Validator, und da es der letzte Fehler ist den die Validatoren auf meinen Seiten anmeckern würd ich es gerne eliminieren (o:-

FontYourFace in der Datei google_font_api, Zeile 119:

$url = $base . implode( '|', $families) . '&subset=' . implode(',', $all_subsets);

Anstelle des '|' gehört da ein '%7C' hin, aber ich will nicht im Source des fremden Modules rumwurschteln (wegen Updates ect.).

Ungefär so sieht das aus, was das Modul an der Stelle genneriert:
<link type="text/css" rel="stylesheet" href="//fonts.googleapis.com/css?family=Open+Sans+Condensed:300|Open+Sans:regular&amp;subset=latin" media="all" />

(Um das Pipe zwischen 300 und Open geht's dabei).

  • Anmelden oder Registrieren um Kommentare zu schreiben

Na, %7C ist doch ein |. Wozu

Eingetragen von wla (9037)
am 29.10.2015 - 19:31 Uhr

Na, %7C ist doch ein |. Wozu also der Aufstand?

.
Werner
drupal-in-duesseldorf.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *

  • Anmelden oder Registrieren um Kommentare zu schreiben

Nur weil die meisten Browser

Eingetragen von qb (140)
am 29.10.2015 - 20:26 Uhr

Nur weil die meisten Browser mit einem & anstelle eines *amp; in der URL klar kommen, entspricht es noch lange nicht den Definitionen. Gleiches gilt für das Pipe-Zeichen.

Das hier meint der Validator dazu:
Fehler: Bad value “//fonts.googleapis.com/css?family=Open+Sans:600,regular|Open+Sans+Condensed:300|Oswald:700|Roboto:500,700&subset=latin” for attribute “href” on element “link”: Illegal character in query: not a URL code point.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Drupal liefert aber doch

Eingetragen von wla (9037)
am 29.10.2015 - 19:58 Uhr

Drupal liefert aber doch UFT8-Code aus und zeigt das auch im header. Daher ist das Pipe-Zeichen wohl definiert. Der Ersatzcode ist also nicht notwendig.

.
Werner
drupal-in-duesseldorf.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *

  • Anmelden oder Registrieren um Kommentare zu schreiben

Das ist alles richtig!

Eingetragen von qb (140)
am 29.10.2015 - 21:02 Uhr

Das ist alles richtig.

Es geht auch nicht um Funktionalität des CSS-Querys. Einige Kunden haben aber die Angewohnheit ihre Seite mittels Validator zu checken. Und unter anderem der in diesen Kreisen sehr populäre "seitwert.de" meckert es an.

Ansonsten ging es mir in dem Threat auch nicht um die Frage ob der Code valide ist, sondern worin das aus meiner Sicht seltsame Verhalten der Drupal-Hooks begründet liegt.
Wie bereits geschrieben, ich bekomme die gewünschte Funktionalität ja API-Konform zum laufen aber eben nicht an der Stelle an der es aus meiner Sicht möglich seien müsste (tiefer in den den Modulen).

  • Anmelden oder Registrieren um Kommentare zu schreiben

Also ich hab das bei mir mal

Eingetragen von Stefan.Korn (286)
am 30.10.2015 - 08:31 Uhr

Also ich hab das bei mir mal ausprobiert mit einem Google-Font über font-your-face. Wenn ich hier $css[key]['data'] in hook_css_alter in meinem Modul ändere, dann greift das auch noch im Theme.

  • Anmelden oder Registrieren um Kommentare zu schreiben

ok

Eingetragen von qb (140)
am 30.10.2015 - 08:55 Uhr

Danke.

Wenn ich dich recht verstanden habe, hast Du auch nur [data] geändert. Daher, den Key des Assoc-Array hast Du nicht gändert, und denooch funktioniert alles so wie erwartet?
Das ist gut, dann kann ich zumindes diese (recht umständliche) Fehlerquelle ausschliessen.

  • Anmelden oder Registrieren um Kommentare zu schreiben

ich folgendes

Eingetragen von Stefan.Korn (286)
am 30.10.2015 - 09:09 Uhr

ich folgendes gemacht:

function test_fyf_css_alter(&$css)
{

$css['http://fonts.googleapis.com/css?family=Cabin:500,600,700&subset=latin']['data'] = "test";

}

Das kam dann auch so im Theme an.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • Drupal 8: Modul prevnext
  • [gelöst]Drupal 8: Fußzeilenmenü auf Login-Seite verschwunden
  • Vom jeweiligen User die Kunstwerke ausgeben.
  • Fullcalendar - Grösse Dialogfenster
  • Notify-Modul: Einmalige Benachrichtigung ueber neue Nodes senden
  • [gelöst]Drupal 9 und Ubuntu 20.04
  • [gelöst] Swiftmailer installieren um Simplenews zum Laufen zu bringen
  • Installiert ja, aber kein einziger link funktioniert
  • Drupal 9 - "read more" übersetzen nun anders, nur wie?
  • [gelöst] Nur editierbare Medien in Media-View anzeigen
  • Probleme mit dem Adminmenü
  • Inhalte ändern/erstellen nicht möglich - Problem mit Datenbank-Verbindung?
Weiter

Neue Kommentare

  • Hey! Das Modul
    vor 3 Stunden 2 Minuten
  • Ich verwende das
    vor 3 Stunden 32 Minuten
  • Du benötigst das Modul
    vor 4 Stunden 57 Minuten
  • Kontakt ist schonmal da! Es
    vor 5 Stunden 41 Minuten
  • Hallo, nein, keine
    vor 6 Stunden 11 Minuten
  • Und da sind keine
    vor 6 Stunden 38 Minuten
  • Hallo, Danke für die
    vor 6 Stunden 59 Minuten
  • Wie kommt das Menü in die
    vor 9 Stunden 1 Minute
  • irgendwo wird doch die nutzer
    vor 1 Tag 8 Stunden
  • inst schrieb Hallo, ich
    vor 1 Tag 8 Stunden

Statistik

Beiträge im Forum: 246311
Registrierte User: 18908

Neue User:

  • coolpet
  • Demophobie
  • JorgeClayton

» Alle User anzeigen

User nach Punkten sortiert:
wla9037
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3917
ronald3834
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 5 Gäste online.

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association