Neues Plugin-System und die Einbindung von LESS/JS-Files

Liebe Community,

ich stehe gerade vor dem Problem, dass ich ein Plugin realisieren möchte, das zusätzliche LESS und Javascript-Files einbindet. Genaugenommen handelt es sich dabei um eine Javascript-Bibliothek (ein 360°-Viewer) und dessen LESS-Definitionen.

Jetzt habe ich in meinem Plugin die folgende Ordnerstruktur unter dem Pfad custom/plugins/:

Wie zu sehen ist arbeite ich hier mit dem Subscriber-Pattern und habe die Events auch soweit richtig registriert.
Der DetailSubscriber sieht bisher so aus:

 'onBeforeDispatchDetail',
            'Theme_Compiler_Collect_Plugin_Less' => 'onCollectPluginLess',
        ];
    }

    public function onBeforeDispatchDetail(\Enlight_Event_EventArgs $args)
    {
        //die('DETAIL DISPATCHED');
    }

    public function onCollectPluginLess() {

        return new LessDefinition(
            [],
            [__DIR__. '/Views/frontend/_public/src/less/all.less']
        );

    }
}

 

 

In der (ehemaligen) Bootstrap-File findet sich dann auch noch mal folgendes:

public static function getSubscribedEvents()
    {
        return [
            'Enlight_Controller_Action_PreDispatch_Frontend' => 'preparePlugin',
        ];
    }

    public function preparePlugin()
    {
       $this->container->get('Template')->addTemplateDir(
           $this->getPath() . '/Resources/Views'
       );
    }

 

Dennoch werden die LESS-Files nicht eingebunden.

Kann mir vielleicht jemand einen heißen Tip geben, was ich für diese Aufgabe übersehe?

 

Liebe Grüße und Danke im Voraus
bquarta

Also bei mir funktioniert das so:

...
class Less implements SubscriberInterface
{
    /**
     * @return array
     */
    public static function getSubscribedEvents()
    {
        return [
            'Theme_Compiler_Collect_Plugin_Less' => 'addLessFiles'
        ];
    }
    /**
     * Provides the less files for compression
     *
     * @return ArrayCollection
     */
    public function addLessFiles()
    {
        $less = new LessDefinition(
            [], // configuration
            [__DIR__. '/../Resources/views/_public/src/less/all.less'], // less files to compile
            __DIR__ // import directory
        );
        return new ArrayCollection([$less]);
    }
}
...

Die all.less verlinkt dann auf die einzelnen anderen Less-Dateien per @import.
Wird dein Subscriber denn geladen? Hast du das mal getestet?

1 „Gefällt mir“

Hi, 

dein Views Verzeichnis liegt ja jetzt nun unter dem Resources Verzeichnis. Der Pfad zur all.less passt nicht mehr ganz  Wink

Viele Grüße aus Schöppingen

cool Michael Telgmann

2 „Gefällt mir“

Hallo Michael Telgmann,

hoppla, da ist mir wohl was entgangen. Ja das stimmt, ich habe das nun angepasst. Allerdings wird die Less immer noch nicht eingebunden. Habe auch nochmal das Theme neu kompiliert, aber leider erfolglos.

Ich komme nicht ganz dahinter was sich bei den Plugins zu der Theme-Sache unterscheidet. Leider finde ich immer nur Anleitungen für LESS und JS-Files auf Basis von Theme-Overrides :/…

 

EDIT:
Ich habe auch die Lösung von Moritz Naczenski getestet. Auch hier leider ohne, dass sich nach dem neu-kompilieren und dem Reinstall des Plugins irgendetwas tut (ich habe in der all.less mal den Seiten-Hintergrund hart geändert, um das sofort zu sehen).

Das Event feuert soweit ich das nachvollziehen kann. Dass der service richtig registriert ist kann ich an dem die-Statement im onBeforeDispatchDetail-Event sehen. Wenn ich etwas via print_r oder sowas im onCollectPluginLess ausgeben will, dann “stirbt” ExtJS beim kompilieren des Themes, weil es das wohl nicht mag ;)… Entsprechend sollte sich da auch was regen.

Liebe Grüße
bquarta

UPDATE:

Sorry, habe den Fehler gefunden. Ich habe vergessen bei den Resources noch mal einen Ordner im Pfad zurück zu springen. Also der Pfad von Moritz in Kombination mit der Lösung ohne Array-Collection (warum auch immer?!) hat das jetzt behoben.

Doof, dass ich die antworten schon als “nicht die Lösung” markiert habe  Foot-in-Mouth

Das Problem ist somit gelöst :slight_smile:

Danke euch beiden