Eigenes Modul CSS

  • Joomla Version
    5.x.x
    PHP Version
    PHP 8.3.x
    Hoster
    Strato

    Hallo Zusammen,

    Ich baue gerade mein erstes Modul

    Und da habe ich doch gleich mal eine Frage

    Ich möchte dem Modul gern eine eigene .css Datei mitgeben

    Nun meine Frage

    Wie muss ich diese CSS in der .xml definieren?

    Und muss dann die Ordnerstruktur des Moduls einen extra Ordner "CSS" haben oder ist das egal wo dann die .css liegt

    Das Selbe wird später bestimmt auch mit .js Dateien kommen daher würde ich das hier gleich mit anfügen

    bei einem Template mache ich das ja über die "joomla.asset.json"

    Gibt es so etwas auch für Module

    Danke im Voraus

    Gruß

    Marcel

  • Die bester Vorgehensweise ist, Du erstellst im Modul einen Ordner "media" in diesem dann die Unterverzeichnisse "css" und "js" liegen. direkt im "media" Verzeichnis die Datei joomla.asset.json (siehe WebsAssetManager) https://docs.joomla.org/J4.x:Web_Assets

    in der XML definierst Du dieses media-Verzeichnis:

    XML
    <media folder="media" destination="name_des_modul">
        <folder>css</folder>
        <folder>js</folder>
        <file>joomla.asset.json</file>
    </media>

    Bei der Installation wird das dann unter Joomla in das Verzeichnis "media" kopiert und von dort aus aufgerufen.

    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • Ich möchte dem Modul gern eine eigene .css Datei mitgeben

    Meine Gegenfrage: aus welchem Grund?

    Aus meiner Sicht wäre es viele einfacher, dem Modul über Erweitert eine Modulklasse (z.B. modulclass ) zu verpasen. Über die kannst Du dann in der user.css alle Anweisungen, die nur dieses Modul betreffen sollen, eindeutig zuordnen.

    Code
    .modulclass . . .

    Gruß

    Heinz

    "Wer es nicht versucht schafft es auch nicht."

  • Ich wäge da schon ab. Wenn ein Modul vielleicht recht üppig viel eigenes CSS haben soll, das Modul aber nicht auf allen Seiten angezeigt wird, dann kann es von Vorteil sein, eine eigene CSS zu laden. Auch, weil die Pflege vielleicht übersichtlicher wird.

    Mich nerven immer Seiten, wo sich in user.css oder template.css zu viel Spaghetti-Zeugs befindet, was vielleicht gar nicht mehr relevant ist, weil die zugehörige Erweiterung längst nicht mehr verwendet wird,

    Beschäftigung mit dem WAM lohnt sich jedenfalls, wenn man öfter mal Erweiterungen schreiben will. Damit geht so unsagbar viel. Längst nicht nur das, was in den Docs beschrieben wird. Auch bequemere Asset-Overrides für Erweiterungsnutzer zu definieren, die dann nicht in diesen unsäglich verschachtelten Ordnern liegen müssen etc. Oder Ladereihenfolgen festlegen, die dämliches !important reduzieren können. Das aber nur nebenbei. Als Motivation sozusagen ;)

  • Hallo LukasHH

    mein "joomla.asset.json" sieht zum Test jetzt so aus

    in welcher Datei muss ich jetzt diesen Code hinzufügen

    Code
    $wa->useStyle('mod_ws-test1');
    $wa->useScript('mod_ws-test');

    damit die Assets auch aktiviert werden

    Hier mal die Struktur des Moduls

    Vielen Dank im Voraus

    Gruß

    Marcel

  • in welcher Datei muss ich jetzt diesen Code hinzufügen

    Das kommt jetzt in die "mod_ws_test.php", wenn es für alle Template-Ausgaben (default.php) gelten soll.

    Wenn man verschiedene Template-Ausgaben erstellt und zu jeder eine andere CSS / JS gilt, dann nimmt man das in dieser jeweils auf.

    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • Danke LukasHH für die schnelle Antwort

    leider bekomme ich da folgenden Fehler

    0 - Call to a member function useStyle() on null

    Meine "mod_ws_test.php" sieht so aus

  • Du musst zuvor ja auch den WebAssetManager aufrufen. $wa gibt es an der Stelle ja noch nicht. Dann sollte das auch unterhalb von den define bzw. den Aufruf der benötigten Klassen. Auch der Aufruf des Template (ModulHelper) ist veraltet und wird bald nicht mehr funktionieren.

    Du kannst Dir als Hilfe am besten aktuelle Module aus dem Core anschauen. Da kann man vieles entnehmen. Denn selbst diese Aufbau gilt schon wieder als veraltet und man geht mehr auf die Dispatcher-Methode. Das sieht man am besten an der "mod_custom". Im Modul "mod_articles_news" kann man sich den Aufruf der helper.php anschauen.

    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • Du musst in der XML auch das JSON-File mit angeben.

    in der Modul PHP am Ende kein ?>

    Aus JModuleHelper wird einfach nur ModuleHelper (ohne J)

    Was noch dazu nicht passt, das sind die unterschiedlichen Schreibweisen des Moduls. Mal mit Unterstrich und im Media-Verzeichnis mit Bindestrich. Das passt nicht zusammen. Die Verzeichnisse müssen einheitlich sein und ich würde auf Bindestrich in Dateinamen / Verzeichnisse sowieso verzichten.

    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • Ah - habe ich fast übersehen.

    Eine entschiedene Zeile fehlte noch. Das JSON muss natürlich auch registriert werden, sonst findet der WA das nicht:

    PHP
    $wa = Factory::getApplication()->getDocument()->getWebAssetManager();
    $wa->getRegistry()->addRegistryFile('media/mod_ws_test/joomla.asset.json');
    $wa->useStyle('mod_ws_test');
    $wa->useScript('mod_ws_test');

    In der JSON habe ich den Namen einheitlich mit mod_ws_test umbenannt. Du musst da keine unterschiedlichen Namen verwenden.

    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • Mich nerven immer Seiten, wo sich in user.css oder template.css zu viel Spaghetti-Zeugs befindet, was vielleicht gar nicht mehr relevant ist, weil die zugehörige Erweiterung längst nicht mehr verwendet wird,

    Das ist alles grundsätzlich richtig.

    Wenn alter, unbenutzter Code vorhanden ist , ist das natürlich vor allem ein (schweres) Versäumnis des Entwickler. Unterschieden werden sollte allerdings zwischen Dienstleistern, die so was natürlich zu recht gar nicht mögen, und den Webseiten-"Designer" wie mich, die nur 2 Webseiten gestalten und schon aus Zeitgründen darauf achten (sollten), dass im Eigeninteresse alles "einfach - eindeutig - sicher" ist.

    Vorausetzung dafür sind regelmäßige Reviews der User.css und der use .js und ausführliche Dokumentationen. Da, wo allerdings die Komponente (wie z.B. JEvents) bereits integration von CSS und JS anbieten, habe ich natürlich gerne darauf zurückgegriffen.

    Was ich sagen will: letztlich entscheidet jeder selbst, welche Vorgehensweise für ihn die beste ist. Ich selbst bevorzuge wenn möglich einfache bis sehr einfache Lösungen.

    Übrigens: die Modulklasse gibt mir auch die Möglichkeit bestimmte Operationen auf mehrere Module (der gleichen Klasse) ohne Zusatzaufwand anzuwenden.

    Gruß

    Heinz

    "Wer es nicht versucht schafft es auch nicht."

  • Hallo zusammen,

    zum Zeitpunkt eurer Beiträge fehlte ja noch die offizielle Dokumentation, wie es gehen soll. Die gibt es jetzt unter https://manual.joomla.org. In Anlehnung an das dortige Beispiel sieht meine xml-Datei so aus:

    XML
       <files>
           <folder module="mod_ws_test">services</folder>
           <folder>src</folder>
           <folder>tmpl</folder>
           <filename>mod_ws_test.xml</filename>
       </files>
        <media destination="mod_ws_test" folder="media">
           <filename>joomla.asset.json</filename>
           <folder>css</folder>
       </media>

    und die erste Ebene in der ZIP-Datei sieht so:

    Shell session
      <DIR> css
        411 joomla.asset.json
        944 mod_ws_test.xml
      <DIR> services
      <DIR> src
      <DIR> tmpl 

    Beim Installieren wird der Ordner unter /media /mod_ws_test angelegt und darunter die Datei joomla.asset.json und der Ordner css einsortiert. Der Rest landet wie erwartet unter /modules.

    Nur falls noch einmal jemand über dieses Problem stolpert!