kanumakanuma MemberComments: 238 Received thanks: 51 Member since: May 2014

Moin,

wenn man einen Controller erstellt wie hier:

https://docs.shopware.com/en/shopware-platform-dev-en/internals/plugins/plugin-quick-start?category=shopware-platform-dev-en/internals/plugins#creating-a-controller

wie lade ich am besten das zugehörige Template, welches vom Shop Template erbt? Also z.b die content Seite um etwas darzustellen ...

Mit freundlichen Grüßen 

marc

Answers

  • kanumakanuma MemberComments: 238 Received thanks: 51 Member since: May 2014

    Danke, aber das meinte ich nicht ...

    mehr oder weniger welchen Return muss man angeben, bzw. Wie rendert man das Template...

  • ShopwareianerShopwareianer MemberComments: 3615 Received thanks: 639 edited June 2019 Member since: November 2013

    Okay, verstehe. Du meinst also wie du einen kompletten custom view für das Frontend rendert? Das ist eine gute Frage.

    In Symfony geht es ja generell mit:

    /**
     * @Route("/default/hello", name="default_hello")
     */
    ....
    return $this->render('default/hello.html.twig', [
        'who' => 'World',
    ]);

    Gibt es dazu schon Infos @Patrick Stahl@Moritz Naczenski‍ wie man ein custom twig Template aus einem Plugin heraus an die Storefront übergibt? Das würde mich auch interessieren, oder geht das aktuell noch nicht?

  • kanumakanuma MemberComments: 238 Received thanks: 51 edited June 2019 Member since: May 2014

    genau... das habe ich auch schon herrausgerunfen... in der keynote in einer Präsentation gibt es ein Code-snippet, aber das hilft nicht wiklich. Leider konnte ich bislang das template nur bedingt laden... leider wird die NAVIGATIOn etc nicht mitgelden. Hier meine route: http://shopware:8000/paulfirstplugin/show/raitings

    image

     

    image

     

     

    image

  • Patrick StahlPatrick Stahl ModeratorComments: 510 Received thanks: 216 Member since: August 2011

    Guten Morgen @Shopwareianer‍ und @kanuma‍!

    $this->render zu nutzen ist garnicht so verkehrt. Dann aber bitte lieber $this->renderStorefront, macht im Prinzip das Gleiche, wirft aber noch ein Event dazu.  :-)

    Bezüglich der Navigation:
    Extende bitte einmal von der Datei @Storefront/base.html.twig.

    Generell gilt es hier aber dazu zu sagen, dass das im Standard häufig noch ein bisschen anders gelöst wird.
    Wenn dein Controller selbst auch in mehrere Bereiche aufgeteilt ist (Eine Übersicht, eine Detailansicht, ...), extenden wir meistens nicht direkt von der o.g. Datei, sondern erst von einer Art "Fundament" Datei, die von allen Templates des Controllers genutzt wird.
    Diese "Fundament" Datei stellt quasi die grobe Struktur der Controller Templates dar.
    Hier mal am Beispiel des Account Controllers. In der ersten Zeile wird von einer _page.html.twig extended. Und das passiert bei allen Account Templates.
    Und eben jenes _page Template extended dann erst von der base.html.twig.
    Das Naming zieht sich so konsequent durch. Wenn du nun aber einen Controller hast, der eh nur einen Bereich kennt und rendert (bspw. Detailseite), ist das natürlich überflüssig.

    Hilft das irgendwie weiter? Foot-in-Mouth

    Gruß,
    Patrick Shopware

  • kanumakanuma MemberComments: 238 Received thanks: 51 edited June 2019 Member since: May 2014

    Moin Paktrik!

    Danke für deine ausführliche Antwort. Leider erschließt sich mir nicht, weshalb ich von @Storefront/base.html.twig extenden soll, denn das Template kennt doch gar nicht das "Gerüst" für eine Content/CMS Seite oder ? Also ich hab das mal eingefügt, dann bleibt aber die Seite leer. Die Navigation etc wird auch nicht geladen.

    Evtl. kannst du das nochmal prüfen :-)

    image

    image

  • Patrick StahlPatrick Stahl ModeratorComments: 510 Received thanks: 216 Member since: August 2011

    Moin @kanuma‍,

    entschuldige, ich hatte übersehen, dass du bereits von page/content/index.html.twig extendest, und die Information, dass du eine CMS Seite bauen möchtest. Hatte irgendwie im Kopf, dass da dein eigenes Template steht.

    Einfach mal die Dau-Frage: Die Navigation ist sonst überall da und du hast auch durchaus ein paar Kategorien?
    Wenn Ja, wüsste ich gerade spontan auch nicht, warum die Navigation bei dir nicht angezeigt wird, da müsste ich auch erstmal schauen und das Szenario nachbauen, sorry! Foot-in-Mouth
    Ggf. hat der @Stephan Pohl‍ da aber einen Rat. :-)

    Gruß,
    Patrick Shopware
     

  • kanumakanuma MemberComments: 238 Received thanks: 51 edited June 2019 Member since: May 2014

    Moin Patrik,

    genau ich möchte eine Content-Seite bauen, also ausprobieren... Der Inhalt ist ja erstmal egal. Die Seite soll unter einer beliebigen Route erreichbar sein z.B. /Kundenbewertungen.

    Ja: Die Navigation ist sonst überall da :-)

  • kanumakanuma MemberComments: 238 Received thanks: 51 Member since: May 2014
  • mkhskymkhsky MemberComments: 4 Received thanks: 2 Member since: January 22

    Moin,

    ich hoffe du hast das Problem mittlerweile selbst hinbekommen. Da ich aber auch gerade starte und das selbe Problem habe, poste ich hier einmal den Grund.

     

    Die Navigation wird nicht angezeigt, weil diese über die "page" variable gesetzt wird.

    Also muss man den GenericPageLoader injecten und den Controller als Service regstrieren.

     

    Controller:

    <?php 
    
    namespace Fluxter\MyAwesomePlugin\Controller;
    
    use Shopware\Core\Framework\Routing\Annotation\RouteScope;
    use Shopware\Core\System\SalesChannel\SalesChannelContext;
    use Shopware\Storefront\Controller\StorefrontController;
    use Shopware\Storefront\Page\GenericPageLoader;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\Routing\Annotation\Route;
    
    /** @RouteScope(scopes={"storefront"}) */
    class AwesomePluginController extends StorefrontController
    {
        private GenericPageLoader $genericPageLoader;
    
        public function __construct(GenericPageLoader $genericPageLoader) {
            $this->genericPageLoader = $genericPageLoader;
        }
    
        /** @Route("/plugin", name="frontend.plugin.index", options={"seo"="false"}, methods={"GET"}) */
        public function index(Request $request, SalesChannelContext $context) {
            $page = $this->genericPageLoader->load($request, $context);
            return $this->renderStorefront("components/plugin/index.html.twig", [
                'page' => $page
            ]);
        }
    }

    Plugin

    <?php declare(strict_types=1);
    
    namespace Fluxter\MyAwesomePlugin;
    
    use Shopware\Core\Framework\Plugin;
    use Symfony\Component\Config\FileLocator;
    use Symfony\Component\DependencyInjection\ContainerBuilder;
    use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
    
    class AwesomePlugin extends Plugin
    {
        public function build(ContainerBuilder $container): void
        {
            parent::build($container);
    
            $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/DependencyInjection'));
            $loader->load('controller.xml');
        }
    }
    

    DependencyInjection/controller.xml

    <?xml version="1.0" ?>
    
    <container xmlns="http://symfony.com/schema/dic/services";
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
               xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">;
    
        <services>
            <defaults public="true" autowire="true" />
    
            <service id="Fluxter\MyAwesomePlugin\Controller\AwesomePluginController" />
        </services>
    </container>
    

    views/components/plugin/index.html.twig

    {% sw_extends '@Storefront/storefront/base.html.twig' %}
    
    {% block base_content %}
    	{{ parent() }}
    	hello world
    {% endblock %}
    

     

  • michal_bnetmichal_bnet MemberComments: 4 Received thanks: 0 Member since: October 2019

    hi mkhsky 

    can you please post here complete plugin ?

    trying to do something similar but not sure where i have error.

    thanks

Sign In or Register to comment.