Smarty wandelt URLs nicht um

Hallo,

ich habe ein Plugin mit einem neuen Controller. Der funktioniert auch super. In diesem Controller habe ich eine Cronjob-Methode, die mir die Urls für die Actions generiert und mit

Shopware()->Modules()->sRewriteTable()->sInsertUrl($org_path, $path);

in die Tabelle s_core_rewrite_urls schreibt.

Da kommen sie auch in der Form 

sViewport=meinplugincontrollername&sAction=meineaction&meinattribut=id

an.

Im Tempate werden sie leider aber nicht korrekt ausgegeben wenn ich
 

{url controller='meinplugincontrollername' action='meineaction' meinattribut=id}

ausführe, bekomme ich nicht die url aus der Datenbank, sondern einfach nur /meinplugincontrollername/meineaction/id

Muss ich den Controller irgendwo registrieren damit Smarty arbeiten kann?

 

Gruß

 

Ok, habs hinbekommen.

Dank Max (falls du hier überhaupt unterwegs bist) und diesem Beitrag (https://forum.shopware.com/discussion/comment/138402/#Comment_138402) habe ich es hinbekommen. Alle Routings mit Parametern müssen gesondert eingetragen werden, wie in der Klasse RewriteGenerator unter Shopware\Components\Routing\Generators.

Das passende Event registiert man so. 

$this->subscribeEvent(
            'Enlight_Controller_Front_RouteStartup',
            'onRouteStartup'
        );

Dann weiter so. Der dritte Parameter muss (anders als im verlinkten beitrag oben) seit Version 5.2 (glaube ich, hab es nicht genau verglichen) auch dabei sein.

    /**
     * @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'),
                    $this->get('events') // Important since SW 5.2
                );
            } else {
                return $generator;
            }
        }, $generators);
        $router->setGenerators($generators);
        
       
    }

Dann noch diese Klasse in den passenden Namespace

 $query['controller']];
        switch ($query['controller']) {
            case 'my_controller_class': // Name of the Plugin Controller Class
            	if($query['action'] == 'index') { //if you need differents params for different actions 
	            	$orgQuery['sAction'] = $query['action']; // Add params
					$orgQuery['sSupplier'] = $query['sSupplier'];
            	} elseif($query['action'] == 'getall') {
	            	$orgQuery['sAction'] = $query['action'];
					$orgQuery['wert'] = $query['wert'];
                    $orgQuery['param'] = $query['param'];
            	}
                
                return $orgQuery;
            default:
                return parent::getOrgQueryArray($query);
        }
    }
}

 

und in die Bootstrap.php muss natürlich dann noch oben drüber

use Shopware\Components\Routing\Generators\RewriteGenerator;
use ShopwarePlugins\{MYPLUGINNAME}\FOLDERTOCLASS\NewRewriteGenerator;

 

Vielleicht kann es jemand gebrauchen.

 

Gruß

ellwe

Hallo ellwe,

ab der Shopware 5.2 wird es dafür übrigens ein passendes Filter-Event geben, damit man sich nicht länger einen eigenen Generator schreiben muss. :slight_smile:
SW-15223 - Implement a new filter-event to edit the seo-queries for p… · shopware/shopware@01eb119 · GitHub

Das kann dann so aussehen:
 

$this->subscribeEvent(
   'Shopware_Components_RewriteGenerator_FilterQuery',
   'onFilterRewriteQuery'
);

sowie:
 

public function onFilterRewriteQuery(\Enlight_Event_EventArgs $args)
{
    $orgQuery = $args->getReturn();
    $query = $args->getQuery();

    if ($query['controller'] === 'mein_controller' && isset($query['mein_parameter'])) {
        $orgQuery['mein_parameter'] = $query['mein_parameter'];
        unset($orgQuery['sAction']);
    }

    return $orgQuery;
}

Vielleicht hilft das in der Zukunft weiter. :slight_smile:

Gruß,
Patrick Shopware

 

2 „Gefällt mir“

@Patrick Stahl schrieb:

Hallo ellwe,

ab der Shopware 5.2 wird es dafür übrigens ein passendes Filter-Event geben, damit man sich nicht länger einen eigenen Generator schreiben muss. :slight_smile:
https://github.com/shopware/shopware/commit/01eb119723873ddcede902038774addb45af934d

Das kann dann so aussehen:
 

$this->subscribeEvent(
‚Shopware_Components_RewriteGenerator_FilterQuery‘,
‚onFilterRewriteQuery‘
);

sowie:
 

public function onFilterRewriteQuery(\Enlight_Event_EventArgs $args)
{
$orgQuery = $args->getReturn();
$query = $args->getQuery();

if ($query[‚controller‘] === ‚mein_controller‘ && isset($query[‚mein_parameter‘])) {
$orgQuery[‚mein_parameter‘] = $query[‚mein_parameter‘];
unset($orgQuery[‚sAction‘]);
}

return $orgQuery;
}

Vielleicht hilft das in der Zukunft weiter. :slight_smile:

Gruß,
Patrick Shopware

 

Ach Mist, hätte ich das mal 24 Stunden vorher gewusst :-) 

Sehr cool, damit wird es dann noch sauberer.

Hallo,

ich habe oben genannten Filter-Event angelegt und entsprechend erweitert, aber die URLs werden von Smarty nicht richtig gerendert.

Meine URLs sollten wie folgt aussehen:

http://www.meinshop.de/meincontroller/meinwert

In der Tabelle s_core_rewrite_urls ist der Eintrag auch entsprechend vorhanden:
org_path: sViewport=meincontroller&meinattribut=wert
path: meincontroller/meinwert

In Smarty wird die URL aber nicht richtig ausgegeben:
aus [
wird ]({url controller=meincontroller meinattribut=wert}) 

Muss da noch etwas registriert werden, oder ist die Registrierung des Events falsch?

public static function getSubscribedEvents()
{
    return [
        'Shopware_Components_RewriteGenerator_FilterQuery' => 'onFilterRewriteQuery'
    ];
}

public function onFilterRewriteQuery(\Enlight_Event_EventArgs $args)
{
    $orgQuery = $args->getReturn();
    $query = $args->getQuery();
    
    if ($query['controller'] === 'meincontroller' && isset($query['meinattribut'])) {
        $orgQuery['meinattribut'] = $query['meinattribut'];
        unset($orgQuery['sAction']);
    }

    return $orgQuery;
}

Gruss, Sven