Zugriff auf URL-Parameter

Hallo zusammen, 

leider ist es mir nicht möglich mit 

 public function onActionPostDispatchWidgetsEmotion(Enlight\_Event\_EventArgs $args) { /\*\* @var \Shopware\_Controllers\_Widgets\_Emotion $subject \*/ $subject = $args-\>getSubject(); $request = $subject-\>Request(); $request-\>getParam('parameter'); } 

auf die URL-Parameter zuzugreifen. 

Kann mir da vielleicht jemand weiterhelfen?

Deine Informationen sind etwas dürftig… aber wie der Zufall es will, bin ich nebenberuflich Glaskugel Verkäufer :wink:

Ist denn onActionPostDispatchWidgetsEmotion als Event in einer “public static function getSubscribedEvents()” Methode registriert? Falls ja, wird in die Methode onActionPostDispatchWidgetsEmotion gesprungen, also z. B. wenn man einen Breakpoint bei eingeschaltetem Debugger setzt oder wenn man mit echo etwas ausgiebt in der Methode?

Was meinst Du dann mit “auf die URL-Parameter zugreifen” konkret? Mit Deinem “$request->getParam(‘parameter’);” greifst Du ja auf den Parameter “parameter” zu, Du machst damit ja dann aber überhaupt nichts. Was hast Du denn vor mit dem Parameter bzw. dessen Wert/Inhalt?

Des Weiteren wäre noch interessant zu wissen: welche Shopware Version wird eingesetzt? Basiert das Plugin auf den Ansatz von Shopware 5.2 oder auf das alte Pluginsystem?

Wenn es sich um Parameter aus der URL handelt kannst du die ganz normal per PHP mit $_REQUEST[“parametername”] abfragen.

Kurz zur Intervention:
Bitte auf  keinen Fall  per $_REQUEST die Parameter holen.
Wenn es mit $this->Request()->getParam() nicht funktioniert, hat das andere Ursachen.

Wenn ihr derartigen Code in einem Plugin nutzt, kommt ihr mit diesem Plugin, soweit ich das richtig im Kopf habe, nicht durch unseren “Codereview Prozess”, falls das Plugin in den Store soll.

Also ich muss mich entschuldigen für die dürftigen Informationen. Ich bin neu in Shopware und in Foren bin ich normalerweise auch nicht unterwegs.
Ziel ist es eine Einkaufswelt mit komplett neuer Logik auszustatten. (Dort soll sowas wie ein onepage-checkout entstehen) Dafür muss ich aber den URL-Parameter abgreifen, weil dadurch die entsprechenden Seiteninhalte geladen werden sollen.
Auf meinem Staging-System ist aktuell die Shopwareversion 5.2.16 im Einsatz.
Der Aufruf dieser Einkaufswelten soll irgendwann so aussehen: BASE_URL/landingpage?promotion=1234567

Also das Event ist registriert. Die Methode wird auch aufgerufen und entsprechend interpretiert.

 $this-\>subscribeEvent( 'Enlight\_Controller\_Action\_PostDispatch\_Widgets\_Emotion', 'onActionPostDispatchWidgetsEmotion' );

 $subject = $args-\>getSubject(); $request = $subject-\>Request(); print\_r($request-\>getParams());

liefert mir nur:

 Array ( [module] =\> widgets [controller] =\> emotion [action] =\> index [emotionId] =\> 7 [controllerName] =\> campaign )

 

Ich hoffe das ist ein bisschen ausführlicher. Ich geb mir echt Mühe :slight_smile:

 

Das kann dort nicht ankommen, da über die widgets ja keine ganzen Seiten sondern nur Fragmente - in dem Fall die EKW selber - (ESI-Tag im Theme) nachgeladen werden, dort werden aber keine weiteren Parameter “durchgereicht”.

@sonic schrieb:

Das kann dort nicht ankommen, da über die widgets ja keine ganzen Seiten sondern nur Fragmente - in dem Fall die EKW selber - (ESI-Tag im Theme) nachgeladen werden, dort werden aber keine weiteren Parameter „durchgereicht“.

Gibt es eine Möglichkeit diese Parameter durchzureichen?

Nicht wirklich. Das wäre ein Schritt vorher im Controller für die Landingpage und dann ggf. in der Theme-Datei. Das dürfte aber auch wieder nicht helfen, weil Du dann bestimmt schnell in den http-cache oder template-cache von smarty läufst und „falsche“ Parameter übergibts.
Ggf. könnte es helfen, im Landingpage-Controller den Wert in die Session zu schreiben, und im Widget die Session auslesen. Aber ich glaube, der EKW-Widget-Controller wird auch gecached - und dann würde der Code gar nicht beim „zweiten“ Aufruf ausgeführt werden.

Deine Logic dürfte im widget einfach falsch aufgehoben sein.

2 „Gefällt mir“

@sonic schrieb:

Nicht wirklich. Das wäre ein Schritt vorher im Controller für die Landingpage und dann ggf. in der Theme-Datei. Das dürfte aber auch wieder nicht helfen, weil Du dann bestimmt schnell in den http-cache oder template-cache von smarty läufst und „falsche“ Parameter übergibts.
Ggf. könnte es helfen, im Landingpage-Controller den Wert in die Session zu schreiben, und im Widget die Session auslesen. Aber ich glaube, der EKW-Widget-Controller wird auch gecached - und dann würde der Code gar nicht beim „zweiten“ Aufruf ausgeführt werden.

Deine Logic dürfte im widget einfach falsch aufgehoben sein.

Vielen Dank für deine Antwort, auch wenn es schade ist das zu hören. :frowning:

Lager Dein ganzes Vorhaben in einen eigenen Controller aus und binde dort bei Bedarf eine Einkaufswelt ein.
Das Grundproblem:
Die Einkaufswelten-Elemente werden via AJAX geladen, können mit einer Anpassung - wenn man die ID kennt - auch fest im Theme “aufgerufen” werden.
Du könntest also z.B. in Deiner index-action einfach die Seite so ausgeben, wie eine EKW wäre oder einen internen Forward auf die Landingpage machen.
In den letzten Tagen hier von mir immer wieder gerne verlinkt, weil ich mir so in einem “leeren Warenkorb” oder “ergebnisloser Suche” eine EKW einbinde - und dafür ein fettes Danke an Stephan Pohl: Quick Tip: Shopping worlds without AJAX
Im eigenen Controller käme Dir jedenfalls kein Cache in die Quere.

1 „Gefällt mir“

Hi,

ich hatte ein ähnliches Problem und nun eine adäquate Lösung gefunden - falls noch von Interesse: 

Konkret müssen die gewünschten GET-Parameter nur an das data-controllerUrl-Attribut bzw. der darin enthaltenen url-Funktion im Block frontend_listing_emotions (themes/Frontend/Bare/frontend/listing/listing.tpl) übergeben werden, d. h. entweder ihr erstellt zunächst einen Override-Template themes/Frontend//Bare/frontend/listing/listing.tpl oder, falls plugin-weise umgesetzt, ins Plugin-Verzeichnis unter frontend/listing/listing.tpl (die Verzeichnisse in diesem Fall dann im Subscriber Enlight_Controller_Action_PreDispatch registrieren), den GET-Parameter mit dem Hook Enlight_Controller_Action_PostDispatchSecure_Frontend_Listing zum Listing-Template assignen und dort die Smarty-Variable an den o. g. Emotion-Attribut übergeben.

Also:

custom/plugins/pluginName/frontend/listing/listing.tpl (s. parameter  bei data-controllerUrl)   :

{extends file="parent:frontend/listing/listing.tpl"}
...
{block name="frontend_listing_emotions"}
	

	{foreach $emotions as $emotion}
		{if $emotion.fullscreen == 1}
			{$fullscreen = true}
		{/if}

		
		
	{/foreach}

	{block name="frontend_listing_list_promotion_link_show_listing"}

		{$showListingCls = "emotion--show-listing"}

		{foreach $showListingDevices as $device}
			{$showListingCls = "{$showListingCls} hidden--{$emotionViewports[$device]}"}
		{/foreach}

		{if $showListingButton}
			
				
					{s name="ListingActionsOffersLink"}Weitere Artikel in dieser Kategorie »{/s}
				
			
		{/if}
	{/block}
{/block}
...


custom/plugins/pluginName/Subscriber/TemplateRegistrationSubscriber.php:


\Subscriber;

use Enlight\Event\SubscriberInterface;

class TemplateRegistrationSubscriber implements SubscriberInterface
{
    /**
     * @var string
     */
    private $pluginDirectory;

    /**
     * @var \Enlight_Template_Manager
     */
    private $templateManager;

    /**
     * @param $pluginDirectory
     * @param \Enlight_Template_Manager $templateManager
     */
    public function __construct($pluginDirectory, \Enlight_Template_Manager $templateManager)
    {
        $this->pluginDirectory = $pluginDirectory;
        $this->templateManager = $templateManager;
    }
    /**
     * {@inheritdoc}
     */
    public static function getSubscribedEvents()
    {
        return [
            'Enlight_Controller_Action_PreDispatch' => 'onPreDispatch',
            'Enlight_Controller_Action_PostDispatchSecure_Frontend_Listing' => 'onPostDispatchFrontendListing'
        ];
    }

    public function onPreDispatch()
    {
        $this->templateManager->addTemplateDir($this->pluginDirectory . '/Resources/views');

    }

    /**
     * @param \Enlight_Controller_ActionEventArgs $args
     */
    public function onPostDispatchFrontendListing(\Enlight_Controller_ActionEventArgs $args)
    {
        $subject = $args->getSubject();
        $request = $subject->Request();
        $view = $subject->View();
        $view->assign('parameter', $request->getParam('parameter'));

    }
}

?>


Der GET-Parameter parameter steht nun im Emotion-Widget und im Enlight_Controller_Action_PostDispatch_Widgets_Emotion - Hook zur Verfügung.

Hier noch das zugehörige services.xml, falls von Interesse:




    
        ...
        
            %.plugin_dir%
            
            
        
        ...
    


 

Ich hoffe, das hilft weiter. :)

Bin mir nicht ganz sicher, habs nicht getest… aber geht da nicht einfach sowas wie

$params['foo'] = $this->Request()->get('foo');

Also zumindest greife ich in eigenen Controllern so auf url Parameter zu bzw übergebe Sie… aber kann mich auch täuschen… wie gesagt, funzt bei EIGNEN Controllern.