Eine längere Recherche und den Austausch mit anderen Entwicklern habe ich schon hinter mir. Sieht aus, als hätten die meisten den HTTP-Cache bisher schlicht nicht genutzt. Ab Shopware 4.2.x ist er nun da und gleich ereilt mich folgende Problematik: Plugins funktionieren nicht mehr wie gewünscht. Eine Standardsituation von Plugins ist etwa auf der Detailseite Post Dispatch Daten abzufragen und zurückzugeben. Wenn ich hier noch zusätzliche Abfragen einbaue - im konkreten Fall prüfe ich die Uhrzeit - werden diese nicht angezeigt. Konkrete Fragen: 1. Was genau ist in den Backend-Konfigurationen mit „NoCache-Controller / Tags“ gemeint? Was wäre denn frontend/detail/price? „Price“ ist ja keine PHP-seitige Action Methode (was ich erstmal unter einem Controller in MVC verstehen würde). http://wiki.shopware.de/Shopware-4-Http … l_817.html 2. Wie kann ich meine Plugins non-cachable machen? Mit dem Pseudocode unter http://wiki.shopware.de/Shopware-4.1-Up … erse-Proxy kam ich zumindest nicht weiter (am Rande: Pseudocode, weil da einiges nicht funktionieren würde, es gibt an der Stelle kein $this Objekt und controllerName wäre detail nicht Detail). Ok, ich habe mich meine Methode im Event ‚Enlight_Controller_Action_PostDispatch_Frontend_Detail‘ angelegt. Ausgeführt wird alles wie auch in allen Shopwareversionen bisher, nur landen meine Variablen im Cache. Eigentlich sollte das hier die Lösung sein, damit passiert aber nichts: $response = $args->getSubject()->Response(); $response = setHeader(‚Cache-Control‘, ‚private‘); Anyone? Besten Dank!
Wir stehen genau vor dem gleichen Problem hat hier schon jemand eine Abhilfe? Gruß Florian
Könnt Ihr beiden mal ein rudimentäres Plugin hier reinstellen? Ich würde mir das Problem gerne einmal anschauen.
[code] function onPostDispatch(Enlight_Event_EventArgs $args) { $view = $args->getSubject()->View(); $request = $args->getSubject()->Request(); if($request->getModuleName()!=‘frontend’){ return; // nur im Frontend ausführen } $preise_ausblenden=false; $admin = Shopware()->Modules()->Admin(); $sUserData = $admin->sGetUserData(); $customergroup = $sUserData[‘additional’][‘user’][‘customergroup’]; // wenn nicht eingeloggt preise ausblenden if(!$admin->sCheckUser()) $preise_ausblenden=true; // Kunde ist kein händler also Shopkunde dann Preise ausblenden iF( $customergroup == “EK” ){ $preise_ausblenden=true; } if($preise_ausblenden){ // Listenansicht $view->extendsBlock(‘frontend_listing_box_article_price’, ’
'); // haupt listenansicht $view->extendsBlock(‘frontend_listing_box_similar_price’, ’
'); // listenansicht zwei $view->extendsBlock(‘frontend_listing_box_article_actions_buy_now’, ‘’); // jetzt bestellen in listenansicht // detailseite $view->extendsBlock(‘frontend_detail_data_price’, ‘’); $view->extendsBlock(‘frontend_detail_data_pseudo_price’, ‘’); $view->extendsBlock(‘frontend_detail_data_price_configurator’, ‘’); $view->extendsBlock(‘frontend_detail_data_price_info’, ‘’); }else{ } [/code] Dadurch das er aber alles irgendwie cached seit 4.2.1. werden auch nicht eingeloggten Nutzern die Preise angezeigt sobald man suich parallel mit einem anderen Browser als Händler Kunde einloggt. Das Caching zu deaktivieren wie unter http://wiki.shopware.de/Shopware-4.1-Up … erse-Proxy beschrieben klappt irgendwie nicht… ich blicke ehrlich gesagt momentan auch nicht durch welches Cachign greift. HTTP-Cache (unter Einstellungen Cache ist deaktiviert) oder Grungeinstelllungen System Frontend Cache…
Kann sich Shopware hierzu vielleicht einmal äußern, den Zugriffszahlen des Beitrags zu Urteiln haben einige dieses Problem… HTTP Cache ist deaktiviert trotzdem wird irgendwie gecached (Serverseitig) Den Cach zu deaktivieren über $view-\>setCaching(false);
oder $request-\>setHeader('Cache-Control', 'private');
oder // Alternativ $plugin = Shopware()-\>Models()-\>getRepository('Shopware\Models\Plugin\Plugin')-\>findOneBy(array('name' =\> 'HttpCache')); $plugin-\>setActive(false); Shopware()-\>Models()-\>flush(false);
klappt einfach nicht… brauchen Dringend Hilfe. Gruß Florian
Bitte die Bootstrap.php einmal soweit vollständig rein schreiben damit man dies testen kann. Des Weiteren wäre die verwendete Shopware Version noch interessant. Gruß
Bootstrap ist der standard Shopware ist Version 4.2.1. [code]<?php /**
- Shopware 4
- Copyright © shopware AG
- According to our dual licensing model, this program can be used either
- under the terms of the GNU Affero General Public License, version 3,
- or under a proprietary license.
- The texts of the GNU Affero General Public License with an additional
- permission and of our proprietary license can be found at and
- in the LICENSE file you have received along with this program.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
- „Shopware“ is a registered trademark of shopware AG.
- The licensing of the program under the AGPLv3 does not imply a
- trademark license. Therefore any rights, title and interest in
- our trademarks remain entirely with us.
*/
/**
-
Shopware Application
-
@category Shopware
-
@package Shopware\Bootstrap
-
@copyright Copyright © shopware AG (http://www.shopware.de)
/
class Shopware_Bootstrap extends Enlight_Bootstrap
{
/*-
@var \Shopware\Components\DependencyInjection\Container
*/
protected $container;
/**
- Instance of the enlight application.
-
@var Enlight_Application
*/
protected $application;
/**
- The class constructor sets the instance of the given enlight application into
- the internal $application property.
-
@param Shopware $application
*/
public function __construct(Shopware $application)
{
$this->setApplication($application); $this->container = $application->Container(); parent::__construct(); } /** * Returns the application instance. * * @return Enlight_Application|Shopware */ public function Application() { return $this->application; } /** * Sets the application instance into the internal $application property. * * @param Enlight_Application $application * @return Enlight_Bootstrap */ public function setApplication(Enlight_Application $application) { $this->application = $application; return $this; } /** * Run application method * * @deprecated 4.2 Dispatching is done in \Shopware\Kernel::handle() * @return mixed */ public function run() { /** @var $front Enlight_Controller_Front */ $front = $this->getResource(‚Front‘); $front->Response()->setHeader( ‚Content-Type‘, ‚text/html; charset=‘ . $front->getParam(‚charset‘) ); $front->dispatch(); } /** * Adds the given resource to the internal resource list and sets the STATUS_ASSIGNED status. * The given name will be used as identifier. * * @param string $name * @param mixed $resource * @return Enlight_Bootstrap */ public function registerResource($name, $resource) { $this->container->set($name, $resource); return $this; } /** * Checks if the given resource name is already registered. If not the resource is loaded. * * @param string $name * @return bool */ public function hasResource($name) { return $this->container->has($name); } /** * Checks if the given resource name is already registered. * Unlike as the hasResource method is, if the resource does not exist the resource will not even loaded. * * @param string $name * @return bool */ public function issetResource($name) { return $this->container->initialized($name); } /** * Getter method for a single resource. If the source is not already registered, this function will * load the resource automatically. In case the resource is not found the status STATUS_NOT_FOUND is * set and an Enlight_Exception is thrown. * * @param string $name * @return mixed */ public function getResource($name) { return $this->container->get($name); } /** * Loads the given resource. If the resource is already registered and the status * is STATUS_BOOTSTRAP an Enlight_Exception is thrown. * The resource is initial by the Enlight_Bootstrap_InitResource event. * If this event doesn’t exist for the given resource, the resource is initialed * by call_user_func. * After the resource is initialed the event Enlight_Bootstrap_AfterInitResource is * fired. In case an exception is thrown by initializing the resource, * Enlight sets the status STATUS_NOT_FOUND for the resource in the resource status list. * In case the resource successfully initialed the resource has the status STATUS_LOADED * * @param string $name * @return bool */ public function loadResource($name) { return $this->container->load($name); } /** * If the given resource is set, the resource and the resource status are removed from the * list properties. * * @param string $name * @return Enlight_Bootstrap */ public function resetResource($name) { $this->container->reset($name); return $this; } /** * Returns called resource * * @param string $name * @param array $arguments * @deprecated 4.2 * @return Enlight_Class Resource */ public function __call($name, $arguments = null) { return $this->container->get($name); } } [/code]
-
@var \Shopware\Components\DependencyInjection\Container
ich meinte natürlich die Bootstrap von deinem Plugin
Hier der vollständige Code Wunschziel ist es die Preise nur Eingeloggten Händlern anzuzeigen, nicht aber Shopkunden ohne login. Und das gleichzeitige Auslbenden des Warenkorbs für nicht eingeloggte Kunden. Ich habe immernoch die Vermutung das an irgend einer Stelle gecached wird da die ganzen modifizierungen mal greifen und mal nicht. [code] class Shopware_Plugins_Frontend_NeHaendlerPreise_Bootstrap extends Shopware_Components_Plugin_Bootstrap { public function install(){ $event = $this->subscribeEvent( ‘Enlight_Controller_Action_PostDispatch’, ‘onPostDispatch’, 0 ); return true; } function onPostDispatch(Enlight_Event_EventArgs $args) { $view = $args->getSubject()->View(); $request = $args->getSubject()->Request(); $response = $args->getSubject()->Request(); if($request->getModuleName()!=‘frontend’){ return; // nur im Frontend ausführen } //$request->setHeader(‘Cache-Control’, ‘private’); if($requestnicht im Kundenbereich ausführen } $view->setCaching(false); $preise_ausblenden=false; $admin = Shopware()->Modules()->Admin(); $sUserData = $admin->sGetUserData(); $customergroup = $sUserData[‘additional’][‘user’][‘customergroup’]; // wenn nicht eingeloggt preise ausblenden if(!$admin->sCheckUser()){ $preise_ausblenden=true; } // Kunde ist kein händler also Shopkunde dann alles ausblenden iF( $customergroup == “EK” ){ $preise_ausblenden=true; } if($preise_ausblenden){ // Listenansicht $view->extendsBlock(‘frontend_listing_box_article_price’, ’
'); // haupt listenansicht $view->extendsBlock(‘frontend_listing_box_similar_price’, ’
'); // listenansicht zwei $view->extendsBlock(‘frontend_listing_box_article_actions_buy_now’, ‘’); // jetzt bestellen in listenansicht // detailseite $view->extendsBlock(‘frontend_detail_data_price’, ‘’); $view->extendsBlock(‘frontend_detail_data_pseudo_price’, ‘’); $view->extendsBlock(‘frontend_detail_data_price_configurator’, ‘’); $view->extendsBlock(‘frontend_detail_data_price_info’, ‘’); // UVP ausblenden $view->extendsBlock(‘frontend_detail_data_ordernumber’, ‘’); } if($request->getControllerName() == “listing”){ $admin = Shopware()->Modules()->Admin(); $sUserData = $admin->sGetUserData(); } // Alternativ $plugin = Shopware()->Models()->getRepository(‘Shopware\Models\Plugin\Plugin’)->findOneBy(array(‘name’ => ‘HttpCache’)); $plugin->setActive(false); Shopware()->Models()->flush(false); } public function getInfo() { $version=“1.0.1”; return array( ‘label’ => ‘XXX - Händler Preise’.$version, ‘autor’ => ‘XXX XXX’, ‘version’ => $version, ‘copyright’ => ‘Copyright © 2014, XXXX’, ‘source’ => “Local”, ‘description’ => ‘Wenn dieses Plugin Aktiv ist weden nur der Kundengruppe Händler Preise, Lagerbestand und Warenkorb angezeigt. Reine Shopkunden sehen nur die Artikel ohne Preise und ohne Lagerbestand. Auch Sieht nur der Shopkunde die Widerrufsbelehrungen nicht aber der Händler.’, ‘license’ => ‘Lizenz’, ‘support’ => ‘XXX’, ‘link’ => ‘XXXX’ ); } } ?>[/code]