Ergebnis 1 bis 6 von 6

Thema: replaceInsertTags-Hook und #[AsInsertTag('xxx')]

  1. #1
    Contao-Nutzer
    Registriert seit
    10.10.2013.
    Beiträge
    52

    Standard replaceInsertTags-Hook und #[AsInsertTag('xxx')]

    Ab Version 6 ist es geplant, den replaceInsertTags-Hook wegfallen und ausschließlich entsprechende PHP-Attribute zu nutzen.

    Jetzt hatte ich die Idee, in einer Erweiterung den Namen des Insert-Tags (sprich den ersten Parameter) alternativ vom Anwender veränderbar zu machen, falls es zu einer Kollision mit einer anderen Erweiterung oder der Fortentwicklung von Contao selbst kommt.

    PHP erlaubt jedoch in Attributen nur Argumente die Literale oder Konstanten sind https://www.php.net/manual/de/langua...tes.syntax.php. Variablen (oder Funktions-/Methodenaufrufe) sind hier nicht vorgesehen. Damit wären nur mehr hart codierte Insert-Tags möglich.

    Gibt es hierzu einen Ansatz oder gar eine Lösung, wie so etwas dann noch umgesetzt werden könnte, wenn es kein "default" mit einem Callback mehr gibt?

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    37.242
    Partner-ID
    10107

    Standard

    Das könntest du vermutlich über einen Compiler Pass erledigen.

    » sponsor me via GitHub or Revolut

  3. #3
    Contao-Nutzer
    Registriert seit
    10.10.2013.
    Beiträge
    52

    Standard

    Ich habe versucht, in das Thema tiefer einzusteigen. Grundsätzlich ist das mit dem Compiler Pass schon der richtige Ansatz, macht die Sache aber wirklich sehr komplex und widerspricht eigentlich der Vereinfachung, die durch die Verwendung der Attribute erreicht werden soll.

    Das grundsätzliche Komplexität ist dadurch gegeben, dass man zum einen den AddInsertTagsPass (core-bundle/src/DependencyInjection/Compiler/AddInsertTagsPass.php) zum Teil nachprogrammieren muss und zum anderen, dass weder getParameter() des Containers noch Config::get() im Compiler Pass verfügbar sind und man so die Konfigurationsdateien manuell auslesen muss.

    So richtig rund ist das irgendwie noch nicht, den Hook nur wegzulassen.

  4. #4
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.583
    User beschenken
    Wunschliste

    Standard

    Darüber, aus anderen Gründen, hatte ich mir auch schon mal Gedanken gemacht.
    Vielleicht wäre es an der Zeit, die Insert-Tags in Erweiterungen auch immer mit dem Namespace beginnen zu lassen.
    Bei mir wäre das aus
    Code:
    visitors::katid::name
    wird dann
    Code:
    bugbuster_visitors::katid::name
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  5. #5
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    37.242
    Partner-ID
    10107

    Standard

    Zitat Zitat von 462 Beitrag anzeigen
    Idass man zum einen den AddInsertTagsPass (core-bundle/src/DependencyInjection/Compiler/AddInsertTagsPass.php) zum Teil nachprogrammieren muss und zum anderen
    Warum willst du den nachprogrammieren? Dein Compiler Pass muss einfach nur vor dem AddInsertTagsPass kommen (also Priority größer 0) und entsprechende Service Tags hinzufügen.


    Zitat Zitat von 462 Beitrag anzeigen
    dass weder getParameter() des Containers noch Config::get() im Compiler Pass verfügbar sind
    Parameter hast du im Compiler Pass auf jeden Fall.
    » sponsor me via GitHub or Revolut

  6. #6
    Contao-Nutzer
    Registriert seit
    10.10.2013.
    Beiträge
    52

    Standard

    Stimmt, die $container->getParameter() stehen im Compiler Pass sowohl für eine config.yaml (oder parameters.yaml, was auch immer man lädt) der Erweiterung als auch für die config/config.yaml mit contao.localconfig der Installation zur Verfügung.
    Die Contao\Config / $GLOBALS['TL_CONFIG'] ist aber noch nicht vorhanden. Eine Einstellungsmöglichkeit im Backend / tl_settings bleibt somit außen vor. Auch müsste der Build dann nach einer Änderung neu angestoßen werden.

    Ansonsten habe ich es hinbekommen. Dabei habe ich hier im Beispiel die Variablenbezeichnungen aus dem AddInsertTagsPass (core-bundle/src/DependencyInjection/Compiler/AddInsertTagsPass.php) weitgehend übernommen.
    Ob das so wirklich eine Verbesserung gegenüber dem replaceInsertTags-Hook ist?
    Code:
      
    // src/ContaoManager/Plugin.php
    
    ...
    
    class Plugin implements BundlePluginInterface, ConfigPluginInterface
    {
        public function getBundles(ParserInterface $parser): array
        {
            return [
                BundleConfig::create(MeinBundle::class)
                    ->setLoadAfter([ContaoCoreBundle::class]),
            ];
        }
    
        public function registerContainerConfiguration(LoaderInterface $loader, array $managerConfig)
        {
            $loader->load(static function (ContainerBuilder $container) {
                $container->addCompilerPass(new class implements CompilerPassInterface {
                    public function process(ContainerBuilder $container) 
                    {
                        $tagName = $container->getParameter('contao.localconfig')['meinInsertTagName'];
    
                        $definition = $container->findDefinition('contao.insert_tag.parser');
        
                        $service = $container->findDefinition('Vendor\App\MeinInsertTagService');
    
                        $subscription = new Definition(InsertTagSubscription::class, [$service, '__invoke', $tagName, null, true, false]);
    
                        $definition->addMethodCall('addSubscription', [$subscription]);
                    }
                });
            }
        }
    }
    PS:
    Was ich noch nicht verstanden habe ist, warum die Insert Tag Services die per Attribut definiert werden, erst nach einem Composer Install und nicht bereits nach einem Cache Warmup zur Verfügung stehen? Ich dachte bisher, bei einem Cache Warmup wird bereits ein komplett neuer Build angestoßen. Für diese Ausführung per Compiler Pass reicht dann doch der Cache Warmup. Zuerst hatte ich den Compiler Pass in der build-Methode der src/MeinBundle.php definiert gehabt. Hier ist dann auch ein Composer Install erforderlich.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •