Ergebnis 1 bis 13 von 13

Thema: Statische Seite in AppBundle generieren

  1. #1
    Contao-Nutzer
    Registriert seit
    02.04.2021.
    Beiträge
    68

    HTML Statische Seite in AppBundle generieren

    Hallo,
    ich möchte gerne eine statische Seite in mein Contao 4.9 generieren lassen und das aus einem AppBundle heraus. Die Seite listet dann via Javascript alle Seiten und deren Bilder auf, das brauchen wir immer wieder mal.

    AppBundles erstellen schaffe ich schon dank https://community.contao.org/de/show...anaged-Edition, aber ich habe keinen Anhaltspunkt, wie ich aus dem Bundle heraus eine statische Seite generiere.
    Mein erster Ansatz ist jetzt eine statische HTML unter src/ToolsBundle/Resources/contao/files/meineStatischeSeite.html, aber die Datei muss noch irgendwie mit einem DCA in Contao registriert werden denke ich und am besten sollte noch eine Link-Eintrag im Contaohauptmenü auf der linken Seite angezeigt werden.

    Warum ein AppBundle? Ich will für diverse interne Erweiterungen Bundles machen, da diese dann super einfach in jedes Web kopiert werden können und alles schön in dem src-Ordner liegt. Finde ich einfach sauberer, als alles in Templates und Skriptdateien rein zu hacken und die dann herum zu kopieren.

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

    Standard

    Was genau meinst du mit "statische Seite generieren"? Willst du einen eigenen Controller umsetzen?
    » sponsor me via GitHub or PayPal or Revolut

  3. #3
    Contao-Nutzer
    Registriert seit
    02.04.2021.
    Beiträge
    68

    Standard

    Ja, genau. Hab das vorher gerade auch herausgefunden das man da einen Controller braucht. Aber ich bekomme das einfache Beispiel noch nicht in meinem AppBundle zum laufen.
    Hab /src/ToolsBundle/Resources/contao/config/routes.yaml wie in der Doku beschrieben angelegt und eine /src/Controller/ExampleController.php
    Geändert von mikefmmedia (19.01.2022 um 09:24 Uhr)

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

    Standard

    Zitat Zitat von mikefmmedia Beitrag anzeigen
    Hab /src/ToolsBundle/Resources/contao/config/routes.yaml wie in der Doku beschrieben angelegt
    Wo hast du das gelesen? Grundsätzlich spielt es keine Rolle wo die YAML Datei liegt, solange du sie korrekt lädst - aber üblicherwise würde der Pfad src/ToolsBundle/Resources/config/routes.yaml lauten.


    Zitat Zitat von mikefmmedia Beitrag anzeigen
    Hab /src/ToolsBundle/Resources/contao/config/routes.yaml wie in der Doku beschrieben angelegt und eine /src/Controller/ExampleController.php
    Die Doku beschreibt den Fall der Applikationsanpassung über den App\ Namespace. Da du ein eigenes Bundle gemacht hast, musst du nun per Contao Manager Plugin (vorausgesetzt du nutzt die Contao Managed Edition) deine Routes auch laden lassen: https://docs.contao.org/dev/framewor...lugininterface
    » sponsor me via GitHub or PayPal or Revolut

  5. #5
    Contao-Nutzer
    Registriert seit
    02.04.2021.
    Beiträge
    68

    Standard

    Ah ok, hab versucht das mal zu adaptieren, aber ganz versteh ich das nicht (und darum funktionierts auch nicht bei mir)

    /app/ContaoManagerPlugin.php
    Code:
     <?php
    
    use Contao\ManagerPlugin\Routing\RoutingPluginInterface;
    use Symfony\Component\Config\Loader\LoaderResolverInterface;
    use Symfony\Component\HttpKernel\KernelInterface;
    
    use Contao\CoreBundle\ContaoCoreBundle;
    use Contao\ManagerPlugin\Bundle\BundlePluginInterface;
    use Contao\ManagerPlugin\Bundle\Parser\ParserInterface;
    use Contao\ManagerPlugin\Bundle\Config\BundleConfig;
    
    
    class ContaoManagerPlugin implements BundlePluginInterface
    {
        /**
         * {@inheritdoc}
         */
        public function getBundles(ParserInterface $parser)
        {
            return [
                BundleConfig::create(ToolsBundle\ToolsBundle::class)->setLoadAfter([ContaoCoreBundle::class])
            ];
        }
    }
    
    
    class Plugin implements RoutingPluginInterface
    {
        public function getRouteCollection(LoaderResolverInterface $resolver, KernelInterface $kernel)
        {
            $file = '@ToolsBundle/Resources/config/routes.yaml';
    
            return $resolver->resolve($file)->load($file);
        }
    }
    /src/ToolsBundle/Controller/ExampleController.php
    Code:
    <?php
    namespace ToolsBundle\Controller;
    
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Routing\Annotation\Route;
    
    /**
     * @Route("/example", name=ExampleController::class)
     */
    class ExampleController
    {
        public function __invoke(Request $request): Response
        {
            return new Response('Hello World!');
        }
    }
    /src/ToolsBundle/Resources/config/routes.yaml
    Code:
    # config/routes.yaml
    app.controller:
        resource: ../../Controller
        type: annotation
    composer.json
    Code:
    ...
        "autoload": {
            "psr-4": { "ToolsBundle\\": "src/ToolsBundle/" },
            "classmap": ["app/ContaoManagerPlugin.php"]
        }
    }
    Siehst du was ich da falsch mache?

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

    Standard

    In deiner app/ContaoManagerPlugin.php hast du nun zwei Klassen definiert, statt nur einer. Wie installierst du das Bundle eigentlich? Also poste mal deine komplette root composer.json.
    » sponsor me via GitHub or PayPal or Revolut

  7. #7
    Contao-Nutzer
    Registriert seit
    02.04.2021.
    Beiträge
    68

    Standard

    Ich habe in wirklichkeit schon 3 (Test)Bundles die funktionieren. Hab einfach immer im Contaomanager composer-update, alle Caches leeren, Datei aktualisieren (Class Loader) und dann gingen zumindest die 3 (Test)Bundles. Hab die 3 Bundles vohrer nur übersichtshalber nicht gezeigt.

    Code:
    {
        "type": "project",
        "require": {
            "alpdesk/alpdesk-frontendediting": "^1.2",
            "contao-themes-net/zero-one-theme-bundle": "^1.8",
            "contao/calendar-bundle": "4.9.*",
            "contao/comments-bundle": "4.9.*",
            "contao/conflicts": "*@dev",
            "contao/faq-bundle": "4.9.*",
            "contao/listing-bundle": "4.9.*",
            "contao/manager-bundle": "4.9.*",
            "contao/news-bundle": "4.9.*",
            "contao/newsletter-bundle": "4.9.*",
            "leycommediasolutions/contao-frontend-builder": "^1.0",
            "markocupic/contao-bundle-creator-bundle": "^1.4"
        },
        "extra": {
            "contao-component-dir": "assets"
        },
        "scripts": {
            "post-install-cmd": [
                "Contao\\ManagerBundle\\Composer\\ScriptHandler::initializeApplication"
            ],
            "post-update-cmd": [
                "Contao\\ManagerBundle\\Composer\\ScriptHandler::initializeApplication"
            ]
        },
        "autoload": {
            "psr-4": { "AppBundle\\": "src/AppBundle/", "InhaltsBundle\\": "src/InhaltsBundle/", "AluMenuBundle\\": "src/AluMenuBundle/", "ToolsBundle\\": "src/ToolsBundle/" },
            "classmap": ["app/ContaoManagerPlugin.php"]
        }
    }

    In der ContaoManagerPlugin.php sind die 3 natürlich auch drinnen:
    Code:
     <?php
    
    use Contao\ManagerPlugin\Routing\RoutingPluginInterface;
    use Symfony\Component\Config\Loader\LoaderResolverInterface;
    use Symfony\Component\HttpKernel\KernelInterface;
    
    use Contao\CoreBundle\ContaoCoreBundle;
    use Contao\ManagerPlugin\Bundle\BundlePluginInterface;
    use Contao\ManagerPlugin\Bundle\Parser\ParserInterface;
    use Contao\ManagerPlugin\Bundle\Config\BundleConfig;
    
    
    class ContaoManagerPlugin implements BundlePluginInterface
    {
        /**
         * {@inheritdoc}
         */
        public function getBundles(ParserInterface $parser)
        {
            return [
                BundleConfig::create(AppBundle\AppBundle::class)->setLoadAfter([ContaoCoreBundle::class]),
                BundleConfig::create(InhaltsBundle\InhaltsBundle::class)->setLoadAfter([ContaoCoreBundle::class]),
                BundleConfig::create(AluMenuBundle\AluMenuBundle::class)->setLoadAfter([ContaoCoreBundle::class]),
                BundleConfig::create(ToolsBundle\ToolsBundle::class)->setLoadAfter([ContaoCoreBundle::class])
            ];
        }
    }
    
    
    class Plugin implements RoutingPluginInterface
    {
        public function getRouteCollection(LoaderResolverInterface $resolver, KernelInterface $kernel)
        {
            $file = '@ToolsBundle/Resources/config/routes.yaml';
    
            return $resolver->resolve($file)->load($file);
        }
    }

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

    Standard

    Wie gesagt hast du gerade zwei verschiedene Klassen in deiner ContaoManagerPlugin.php drin. Da drin sollte sich nur die ContaoManagerPlugin Klasse befinden - und diese Klasse muss das RoutingPluginInterface implementieren. Also:

    PHP-Code:
    <?php

    use Contao\CoreBundle\ContaoCoreBundle;
    use 
    Contao\ManagerPlugin\Bundle\BundlePluginInterface;
    use 
    Contao\ManagerPlugin\Bundle\Config\BundleConfig;
    use 
    Contao\ManagerPlugin\Bundle\Parser\ParserInterface;
    use 
    Contao\ManagerPlugin\Routing\RoutingPluginInterface;
    use 
    Symfony\Component\Config\Loader\LoaderResolverInterface;
    use 
    Symfony\Component\HttpKernel\KernelInterface;

    class 
    ContaoManagerPlugin implements BundlePluginInterfaceRoutingPluginInterface
    {
        public function 
    getBundles(ParserInterface $parser)
        {
            return [
                
    BundleConfig::create(AppBundle\AppBundle::class)->setLoadAfter([ContaoCoreBundle::class]),
                
    BundleConfig::create(InhaltsBundle\InhaltsBundle::class)->setLoadAfter([ContaoCoreBundle::class]),
                
    BundleConfig::create(AluMenuBundle\AluMenuBundle::class)->setLoadAfter([ContaoCoreBundle::class]),
                
    BundleConfig::create(ToolsBundle\ToolsBundle::class)->setLoadAfter([ContaoCoreBundle::class])
            ];
        }

        public function 
    getRouteCollection(LoaderResolverInterface $resolverKernelInterface $kernel)
        {
            
    $file '@ToolsBundle/Resources/config/routes.yaml';

            return 
    $resolver->resolve($file)->load($file);
        }
    }
    » sponsor me via GitHub or PayPal or Revolut

  9. #9
    Contao-Nutzer
    Registriert seit
    02.04.2021.
    Beiträge
    68

    Daumen hoch

    Ach da lag das Problem, super danke! Dein Änderungsvorschlag im ContaoManagerPlugin.php war die Lösung!

  10. #10
    Contao-Nutzer
    Registriert seit
    02.04.2021.
    Beiträge
    68

    Standard

    Ich will nochmal nachhacken. Wie schaffe ich es dann in dem Controller, ein eigenes Template auszugeben, das zB in /src/ToolsBundle/Resources/contao/templates/ liegt.

    Habe es so versucht, aber das Contaoframework existiert an der Stelle nicht und ich schaffe es nicht zu initialisieren.
    Code:
    <?php
    // src/Controller/ExampleController.php
    namespace ToolsBundle\Controller;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Routing\Annotation\Route;
    
    use Contao;
    use Contao\CoreBundle\ContaoCoreBundle; 
    use Twig\Environment;
    
    class ExampleController
    {
        public function __invoke(Request $request): Response
        {
            $this->container->get('contao.framework')->initialize(); 
            return new Response($this->twig->render('myTemplate.html5'));
      }
    Hier bekomme ich immer einen Fehler "...Call to a member function get() on null..."

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

    Standard

    Contao PHP Templates kannst du nicht via Twig Rendern lassen. Nur Twig Templates kannst du via Twig Rendern lassen. Für Contao Templates nutzt du einfach
    PHP-Code:
    $template = new FrontendTemplate();
    return 
    $template->getResponse(); 
    bspw.
    » sponsor me via GitHub or PayPal or Revolut

  12. #12
    Contao-Nutzer
    Registriert seit
    02.04.2021.
    Beiträge
    68

    Standard

    Um ehrlich zu sein versteh ich das mit dem Use und Namespace nicht so ganz, bin nicht wirklich ein PHP Programmierer.

    Ich hab mein Ziel aber mit einem vlt etwas unschönen Umweg erreicht. Am Ende besteht meine statische Seite nur aus einem Style und einem kleinem Script, das was in den Body schreibt.

    Code:
    <?php
    namespace ToolsBundle\Controller;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Routing\Annotation\Route;
    
    /**
     * @Route("/findUsedImages", name=FindUsedImagesController::class)
     */
    class FindUsedImagesController
    {
        public function __invoke(Request $request): Response
        {
            $dir = __DIR__;
            while ($dir != '.' && $dir != '/' && !is_file($dir . '/system/initialize.php')){
                $dir = dirname($dir);
            }
    
            $style = file_get_contents($dir.'/src/ToolsBundle/Resources/contao/files/custom.css');
            $script = file_get_contents($dir.'/src/ToolsBundle/Resources/contao/files/script.js');
    
            $html = '<html>
            <head>
                <meta charset="utf-8">
                <title>Imagefinder</title>
                <base href="https://bundletest.mike.fm-media-staging.at/">
                <meta name="robots" content="index,follow">
                <meta name="description" content="">
                <meta name="generator" content="Contao Open Source CMS">
                <meta name="viewport" content="width=device-width,initial-scale=1.0">
                <style>
                '.$style.'
                </style>
                <script>
                '.$script.'
                </script>
            </head>
            <body>
            <h1>Alle Bilder der Webseite aufgelistet nach Seiten:</h1>
            </body>
            </html>';
            return new Response($html);
        }
    }

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

    Standard

    Zitat Zitat von mikefmmedia Beitrag anzeigen
    Um ehrlich zu sein versteh ich das mit dem Use und Namespace nicht so ganz, bin nicht wirklich ein PHP Programmierer.
    Wenn du PHP programmierst, bist du PHP Programmierer .
    » sponsor me via GitHub or PayPal or Revolut

Aktive Benutzer

Aktive Benutzer

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

Lesezeichen

Lesezeichen

Berechtigungen

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