Frontend Cache Problem

Hallo zusammen,

ich würde gerne im Frontend immer die IP-Adresse des Users anzeigen lassen. Habe dafür ein Plugin geschrieben.

public static function getSubscribedEvents() {
        return [
            'Enlight_Controller_Action_PostDispatch_Frontend' => 'onFrontendPostDispatch',
            'Enlight_Controller_Action_PostDispatchSecure_Frontend' => 'onFrontendPostDispatchSecure',
        ];
    }

Das funktioniert auch alles wunder. Jedoch bekomme ich bei allen Usern die gleiche IP-Adresse angezeigt. Immer von dem User der als erstes auf den Shop gekommen ist. Die User haben definitv andere IP-Adressen. Wenn ich den Shop Cache leere und mit einer anderen IP-Adresse auf den Shop zugreife, wird diese überall angezeigt …

public function onFrontendPostDispatchSecure(\Enlight_Controller_ActionEventArgs $args) {
      
        $subject = $args->getSubject();

        $ipAddress = $this->getIpAddress();

        $subject->View()->assign('ipAddress', $ipAddress);

        $subject->View()->assign(['csrfToken' => Shopware()->Session()->offsetGet('X-CSRF-Token')]);

    }

 

{extends file="parent:frontend/index/index.tpl"}

{block name='frontend_index_footer'}
    Meine IP-Adresse lautet: {$ipAddress}

    {$smarty.block.parent}
{/block}

 

Vielleicht kann mir jemand helfen. Vielen Dank im Voraus!

Viele Grüße

Max

Hallo,

ist doch aber klar, weil die Anfrage gecacht wird. Entweder stellst du das Caching aus oder packst das alles in einen Action- / Widget-Controller.

Grüße

Sebastian

1 „Gefällt mir“

Hey Sebastian,

vielen Dank für deine Antwort, das hatte ich mir auch gedacht. Jetzt komme ich an einer anderen Stelle nicht weiter und bin am verzweifeln. Registriere jetzt einen Frontend Controller

public static function getSubscribedEvents() {
        return [
            'Enlight_Controller_Dispatcher_ControllerPath_Frontend_Ipaddress' => 'getIpAddressController',
        ];
    }

Im Template, in der frontend/index/index.tpl rufe ich den Controller so auf:

{block name='frontend_index_footer'}
    {action module='frontend' controller='Ipaddress' action='index'}

    Meine IP-Adresse lautet: {$Ipaddress}

    {debug}

    {$smarty.block.parent}
{/block}

Der Controller wird auch aufgerufen und springt in die indexAction. Jedoch wird mir in meinem Template die Variable nicht angezeigt. In meinem debug Fenster allerdings schon. Es scheint so, als sei sie beim rendern noch nicht zur Verfügung gewesen.

 public function indexAction() {
        $this->View()->ipAddress = $this->getIpaddress();
    }

 

Vielleicht kann jemand noch mal helfen. 

Vielen Dank und viele Grüße

Max

Hi,

normalerweise sollte das Action-Widget selbst eine Ausgabe machen (Also “< h1>Meine Ip-Adresse lautet…” usw.). Das funktioniert quasi (sehr vereinfacht) wie ein Iframe - das rendert dir also direkt eine Ausgabe. Dafür musst du ein zum Controller passendes Template anlegen und brauchst das dann  im umgebenden Template nicht mehr.

Besten Gruß

Daniel

1 „Gefällt mir“

Hi Daniel,

danke für deine Antwort. Soweit bin ich mittlerweile auch. Jedoch müsste ich in dem Template wiederum auf die Smarty Blöcke aus der frontend/index/index.tpl zugreifen. Wenn ich ein extends in das Template integriere funktioniert es nicht.

Hättest du mir hierfür auch eine Lösung?

Vielen Dank und viele Grüße

Max