Ich habe ein kleines Menüproblem. Die aktiven Registerkarten stimmen nicht mit der aktiven Klasse überein. Wenn ich den static_block
Cache deaktiviere , funktioniert er wieder, sodass das Menü tatsächlich zwischengespeichert ist und weiterhin den zwischengespeicherten Inhalt anzeigt, unabhängig von der ausgewählten Registerkarte.
Ich habe versucht, cacheable=false
den Block des betreffenden Topmenüs im default.xml
Layout zu aktivieren, aber dies hat nichts geändert.
wenn jemand dieses Problem bereits hatte oder einen Vorsprung hat ...
Bearbeiten:
Ich habe es schnell behoben, indem ich das Topmenü aus dem Cache entfernt habe (wenn ich verstanden habe, was ich richtig gemacht habe), aber wie Sie sehen, ist es nicht schrecklich, aber es funktioniert jetzt sehr gut
<?php
namespace MyNamespace\Indo\Block\Html;
use Magento\Framework\Data\Tree\NodeFactory;
use Magento\Framework\Data\TreeFactory;
use Magento\Framework\View\Element\Template;
use Magento\Framework\View\LayoutFactory;
use TemplateMonster\Megamenu\Helper\Data;
class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{
public $_helper;
public $_layoutFactory;
public function __construct(
Template\Context $context,
NodeFactory $nodeFactory,
TreeFactory $treeFactory,
Data $helper,
LayoutFactory $layoutFactory,
array $data = []
)
{
parent::__construct($context, $nodeFactory, $treeFactory, $data);
$this->_helper = $helper;
$this->_layoutFactory = $layoutFactory;
}
/**
* Get block cache life time
*
* @return int
* @since 100.1.0
*/
protected function getCacheLifetime()
{
return 0;
}
}
quelle
Antworten:
Nach meinem Verständnis gibt es keine perfekte Lösung für dieses Problem. Unabhängig davon, für welches Update Sie sich entscheiden, hat es seine Nachteile.
Ich denke, es gibt möglicherweise auch zwei andere Techniken, die Sie verwenden können: ESI (Edge Side Includes) oder Locher. Obwohl ich keine Erfahrung oder Kenntnisse darüber habe, wenn dies gültige Techniken für diesen Zweck sind. Ich werde jemanden, der sie besser versteht, erklären lassen.
TLDR
Wenn Sie möchten, dass das Navigationssystem immer den richtigen aktiven Status anzeigt und es Ihnen nichts ausmacht, einen kleinen Leistungstreffer zu erzielen, deaktivieren Sie das Caching im Navigationsblock und versuchen Sie, ihn so nahe wie möglich am Stammblock zu halten.
Wenn Sie maximale Leistung wünschen, deaktivieren Sie das serverseitige Rendern und hoffen Sie, dass der Besucher JS aktiviert hat.
Überblick
In Magento gibt es sowohl serverseitige als auch clientseitige Logik, um den aktiven Status für Navigationselemente festzulegen. Standardmäßig ist aus irgendeinem Grund sowohl die server- als auch die clientseitige Logik aktiv.
Serverseitige Logik
Das Problem bei der Verwendung der serverseitigen Logik besteht darin, dass Sie den Block nicht zwischenspeichern können, da Sie auch diesen aktiven Status zwischenspeichern werden. Wenn Sie das Caching für das Navigationsmenü deaktivieren, ist das beste Szenario, dass Sie nur den Ganzseiten-Cache ungültig machen. Im schlimmsten Fall machen Sie einige andere Blöcke wie den Header usw. ungültig, je nachdem, wie Ihr Thema eingerichtet ist.
Die serverseitige Logik finden
Magento\Theme\Block\Html\Topmenu::_getMenuItemClasses()
Sie unter Sie verwendet die Eigenschaftenis_active
undhas_active
für das übergebene Baumknotenattribut, die in festgelegt sindMagento\Catalog\Plugin\Block\Topmenu::getCategoryAsArray
Clientseitige Logik
Der Nachteil dieser Methode ist, dass bis zum Laden des JS kein aktiver Status markiert ist. Und wenn der Client JS deaktiviert hat, hat er überhaupt keine aktive Anzeige.
Die Funktion, die die clientseitige Logik verarbeitet
lib/web/mage/menu.js::_setActiveMenu()
, funktioniert so, dass sie die href der Navigationselemente durchsucht und prüft, ob eine mit der aktuellen URL übereinstimmt.Lösungen
Caching deaktivieren
Sie können das Caching im Navigationsblock deaktivieren. Dadurch wird auch das Caching in den übergeordneten Blöcken deaktiviert. Befindet sich Ihr Navigationsblock also innerhalb Ihres Headerblocks, wird Ihr Header auch nicht zwischengespeichert.
Sie können dies tun, indem Sie
TTL
dencatalog.topnav
Wert auf dem XML-Knoten festlegen,0
der dem Überschreiben des Blocks und dem Überschreiben der Cache-Lebensdauer entspricht.Verwenden Sie die clientseitige Logik
Die andere Methode besteht darin, den aktiven Status zu deaktivieren, der auf der Serverseite gerendert wird, und sich auf die clientseitige Logik zu verlassen.
Da die
Magento\Theme\Block\Html\Topmenu::_getMenuItemClasses()
Methode privat ist, können wir kein Plugin verwenden, um das Ergebnis zu ändern. Sie können die Klasse mit einer Voreinstellung und entweder überschreibenactive
undhas-active
aus dem endgültigen Arrayquelle
Die @arno-Lösung in der ursprünglichen Frage funktioniert perfekt für mich, aber ich wollte die Implementierung des Codes etwas erweitern. Sowie die Vereinfachung des nicht benötigten Codes.
Erstellen Sie ein benutzerdefiniertes Modul für die Änderungen
app / code / VendorName / ModuleName / registration.php
app / code / VendorName / ModuleName / etc / module.xml
app / code / VendorName / ModuleName / etc / di.xml
app / code / VendorName / ModuleName / Block / Html / Topmenu.php
quelle
Ihre Lösung sieht gut aus, aber meines Wissens
CacheLifetime
wird der Cache für diese Seite deaktiviert, wenn Sie auf Null gesetzt sindcacheable=false
Daher möchte ich empfehlen, den Cache programmgesteuert zu entfernen, anstatt
CacheLifetime
Null zu setzen.Sie können den Cache programmgesteuert auf folgende Weise löschen.
Konstruktor definieren - übergeben
Magento\Framework\App\Cache\TypeListInterface
undMagento\Framework\App\Cache\Frontend\Pool
an den Konstruktor Ihrer Datei übergeben, wie unten definiert.Fügen Sie nun den folgenden Code zu der Methode hinzu, in der Sie den
clear/flush
Cache erstellen möchtenAuf diese Weise können Sie den Cache bereinigen und leeren.
Hinweis: Im obigen Code habe
$types=
ich alle Arten von Cache definiert. Sie können den Cache-Typ gemäß Ihren Anforderungen definieren.Es gibt eine andere Methode zum Löschen des Cache, wenn Sie keinen Cache-Typ fest codieren möchten
Ich hoffe, es hilft!
quelle
cache lifetime
& zu spielen,cachable=false
da es sich um einen deaktivierten Cache für die gesamte Seite handelt und möglicherweise die Chance auf ein neues Problem besteht. Vielen Dank.