Eigener Frontend Controller

Guten Morgen, kann man über ein Plugin einen Frontend Controller erstellen, den man dann zb. über $args-\>getSubject()-\>redirect('meinController', 'meineAction'); aufrufen kann?

Hallo pwoerdehoff, dazu legst du einfach einen Controller, also die Datei, in deinem Plugin an. Anschließend musst du ein Event nach folgendem Muster in der Install-Methode angeben: $this-\>subscribeEvent('Enlight\_Controller\_Dispatcher\_ControllerPath\_Frontend\_DeinControllerName', 'onGetControllerPathFrontend'); Die dazugehörige Funktion sieht dann so aus: public function onGetControllerPathFrontend(Enlight\_Event\_EventArgs $args) { return $this-\>Path() . 'PfadZu/DeinemController.php'; } Hilft dir Dies weiter? Gruß, Patrick :shopware:

1 „Gefällt mir“

Hey Patrick, top, das ist genau wonach ich gesucht habe! Vielen Dank! Weißt du auch noch zufällig wie ich Smarty sagen kann, wo es die zugehörigen .tlp’s findet? Unable to load template snippet 'frontend/onestepcheckout/index.tpl|frontend/plugins/compare/index.tpl|frontend/plugins/seo/index.tpl' in Smarty/sysplugins/smarty\_internal\_templatebase.php

Hallo, du kannst dazu einfach in der indexAction das jeweilige Template laden. Dies kann beispielsweise so aussehen: public function init() { $this-\>View()-\>addTemplateDir(dirname(\_\_FILE\_\_) . "/../../Views/"); } public function indexAction() { $this-\>View()-\>loadTemplate("frontend/index/meinTemplate.tpl"); } Es wird erst ein neues Template-Directory “Views” hinzugefügt. Hier wird davon ausgegangen, dass sich der Controller nicht in dem selben Ordner wie die Bootstrap befindet. Anschließend lädst du in der indexAction das jeweilige Template. Der Pfad zu dem Template wäre in diesem Fall deinPlugin/Views/frontend/index/meinTemplate.tpl Wenn du beispielsweise eine Action hast, die kein Template benötigt, kannst du dort einfach Folgendes angeben: Shopware()-\>Plugins()-\>Controller()-\>ViewRenderer()-\>setNoRender(); Dann wird Smarty kein Template laden. Ich hoffe ich konnte dir weiterhelfen. Gruß, Patrick :shopware:

5 „Gefällt mir“

Hey Patrick, du hast wieder genau ins Schwarze getroffen! Vielen Dank, echt top Support!

Hallo Patrick, Gibts die Möglichkeit dem Plugin zu sagen, dass er statt gar keiner View oder seiner eigenen die View eines anderen Systems benutzen soll? Vielen Dank für die Hilfe Tom

und hier für alle, die mit der Shopwareprogrammierung noch nicht vertraut sind, hier der ganze Code. Aufrufen kann man den Controller mit: http://localhost/shopware.php?sViewport=Meincontroller Im Backend unter Inhalt | Shopseiten die neue Seite verlinken. Bootstrap.php [code]<?php class Shopware_Plugins_Frontend_swagMeincontroller_Bootstrap extends Shopware_Components_Plugin_Bootstrap
{
public function getVersion()
{
return ‘1.0.0’;
}

public function getLabel()
{
    return 'Meincontroller';
}

public function getDescription()
{
    return 'Meincontroller';
}

public function getInfo()
{
    return array(
        'version' => $this-\>getVersion(), 'label' =\> $this-\>getLabel(), 'description' =\> $this-\>getDescription()); } public function getCapabilities() { return array( 'install' =\> true, 'enable' =\> true, 'update' =\> false ); } public function install() { $metaDataCache = Shopware()-\>Models()-\>getConfiguration()-\>getMetadataCacheImpl(); $metaDataCache-\>deleteAll(); $this-\>subscribeEvent('Enlight\_Controller\_Dispatcher\_ControllerPath\_Frontend\_Meincontroller', 'onGetControllerPathFrontend'); return array('success' =\> true, 'invalidateCache' =\> array('backend', 'proxy')); } public function enable() { return true; } public function uninstall() { return true; } public function disable() { return true; } public function onGetControllerPathFrontend(Enlight\_Event\_EventArgs $args) { return $this-\>Path() . 'Controllers/Frontend/Meincontroller.php'; } } [/code] [b]Controllers/Frontend/Meincontroller.php[/b] [code]<?php class Shopware_Controllers_Frontend_Meincontroller extends Enlight_Controller_Action

{

    public function init()
    {
       $this->View()-\>addTemplateDir(dirname(\_\_FILE\_\_) . "/../../Views/"); } public function indexAction() { $this-\>View()-\>loadTemplate("frontend/index.tpl"); } } [/code] [b]Views/frontend/index.tpl[/b] [code] {extends file="frontend/index/index.tpl"} {block name="frontend\_index\_content"}

{s name='SitemapHeader'}Hallo, hier ist dein Controller {/s}

{/block} [/code]
3 „Gefällt mir“

@Basti Hi, sehr guter Beitrag – vielleicht sollte man erwähnen, dass der Erste Buchstabe des Controller-Namens GROSS geschrieben werden muss, damit die Enlight_Controller_Action registriert. (In Deinem Beispiel > [color=red]M[/color]eincontroller) Relevante Programmzeilen: engine/Shopware/Plugins/Local/Frontend/[color=gray]swagMeincontroller[/color]/[color=blue]Bootstrap.php[/color] $this->subscribeEvent(‚Enlight_Controller_Dispatcher_ControllerPath_Frontend_[color=red]M[/color]eincontroller‘, ‚onGetControllerPathFrontend‘); [color=gray][+][/color] public function onGetControllerPathFrontend(Enlight_Event_EventArgs $args){ return $this->Path() . ‚Controllers/Frontend/[color=red]M[/color]eincontroller.php‘; } [color=gray][—] [+][/color] engine/Shopware/Plugins/Local/Frontend/[color=gray]swagMeincontroller[/color]/Controllers/Frontend/[color=red]M[/color][color=blue]eincontroller.php[/color] class Shopware_Controllers_Frontend_[color=red]M[/color]eincontroller extends Enlight_Controller_Action{ … –

Liebes Forum :slight_smile: :slight_smile: ich hole diesen alten Thread noch einmal hervor. Ich habe das mal versucht mit den Dateien und habe es auch im Backend angemeldet. Die neue Shopseite steht dann auch im Frontend zur Verfügung. Allerdings wird bei mir die Templatedatei index.tpl nicht gefunden bzw. wir durch sie keinerlei Änderung des Aussehens der Seite bewirkt. Woran könnte das liegen? Und dann wird bei dieser Seite ein neuer Tab geöffnet. Ist das so richtig / gewollt? Wie kann man es erreichen, dass die Seite im gleichen Tab geöffnet wird. So ist das ja bei den anderen Shopseiten auch.