Eigenes Plugin mit URL rewrite

Hallo zusammen, ich habe ein eigenes Plugin erstellt, in welchem nun aber noch “schöne” umgeschriebene URLs verwendet werden sollen. Ich will jedoch nicht nur feste URLs umschreiben, sondern habe für jede URL noch eine ID ähnlich wie bei den Artikeln. Ich habe soweit auch alles eingebaut, die URLs werden richtig über Shopware()-\>Modules()-\>RewriteTable()-\>sInsertUrl(...); eingetragen, allerdings funktioniert das automatische umschreiben mit der Smarty URL Funktion nicht. Nach ein bisschen herum suchen bin ich darauf gestoßen, dass in der Funktion Shopware\Components\Routing\Generators\RewriteGenerator::getOrgQueryArray() der Parameter der ID entfernt wird. Falls ich diesen nun in der Funktion den Parameter hinzufüge funktioniert auch alles. Jedoch weiß ich nicht wie ich dieses Verhalten von meinem Plugin aus implementieren kann/soll. Beste Grüße Max

Hi Max, ja, an der genannten Stelle bist du richtig. Da mit Shopware 5 die Events aus dem Router entfernt wurden, muss du jetzt DI einsetzten. Da der Router jetzt soweit „DI“ ist, sollte es kein Problem sein: Außerdem waren die Events nicht performant. :slight_smile: https://developers.shopware.com/develop … ion-plugin Achtung: Da der Router vor den Plugins geladen wird, musst du statt dem dort genannten Event dieses Event verwenden: $this-\>subscribeEvent( 'Enlight\_Controller\_Front\_RouteStartup', 'onRouteStartup' ); Viele Grüße Heiner

Ein Pluginbeispiel wäre dazu sehr hilfreich, wie man dies mit Hilfe von DI bewerkstelligen könnte

Ja, ein Beispiel kannst du bekommen: :slight_smile: engine/Shopware/Plugins/Community/Frontend/SwagSeoRoutes/Bootstrap.php [code]<?php use \Shopware\Components\Routing\Generators\RewriteGenerator;

/**

  • @category Shopware
  • @package Shopware\Plugins\SwagSeoRoutes
  • @copyright Copyright © shopware AG (http://www.shopware.de)
    /
    class Shopware_Plugins_Frontend_SwagSeoRoutes_Bootstrap extends Shopware_Components_Plugin_Bootstrap
    {
    /
    *
    • @return bool
      */
      public function install()
      {
      $this->subscribeEvent( ‘Enlight_Controller_Front_RouteStartup’, ‘onRouteStartup’ ); return true; } /** * @param Enlight_Controller_EventArgs $args */ public function onRouteStartup($args) { /** @var \Shopware\Components\Routing\Router $router */ $router = $this->get(‘router’); $generators = $router->getGenerators(); $generators = array_map(function($generator) { if($generator instanceof RewriteGenerator) { return new NewRewriteGenerator( $this->get(‘dbal_connection’), $this->get(‘query_alias_mapper’) ); } else { return $generator; } }, $generators); $router->setGenerators($generators); } } class NewRewriteGenerator extends RewriteGenerator { protected function getOrgQueryArray($query) { $orgQuery = [‘sViewport’ => $query[‘controller’]]; switch ($query[‘controller’]) { case ‘meinPlugin’: $orgQuery[‘action’] = $query[‘action’]; $orgQuery[‘groupid’] = $query[‘groupid’]; $orgQuery[‘id’] = $query[‘id’]; return $orgQuery; default: return parent::getOrgQueryArray($query); } } }[/code] Das ist aber noch nicht ganz optimal. Es wäre ja schön, wenn man weitere Routen ohne extra Plugin hinzufügen kann. Vielleicht hast du ja eine Idee? Gruß Heiner
1 „Gefällt mir“

ich würde mir hierbei wünschen “Plugin-Routen” per Plugin dynamisch definieren zu können ohne eine interne Core Funktion zu manipulieren.