Ich habe folgenden Code verwendet, um benutzerdefinierte Links in das Topmenü einzufügen.
Aber die kommen in der letzten Hauptnavigation. Ich möchte zuerst über uns, dann eine andere Kategorie, dann kontaktiert uns usw.
<?php
namespace Dcw\Customer\Plugin\Block;
use Magento\Framework\Data\Tree\NodeFactory;
class Topmenu
{
/**
* @var NodeFactory
*/
protected $nodeFactory;
public function __construct(
NodeFactory $nodeFactory
) {
$this->nodeFactory = $nodeFactory;
}
public function beforeGetHtml(
\Magento\Theme\Block\Html\Topmenu $subject,
$outermostClass = '',
$childrenWrapClass = '',
$limit = 0
) {
$node = $this->nodeFactory->create(
[
'data' => [
'name' => __('ABOUT US'),
'id' => 'aboutus',
'url' => 'http://www.example.com/',
'has_active' => true,
'is_active' => true // (expression to determine if menu item is selected or not)
],
'idField' => 'id',
'tree' => $subject->getMenu()->getTree()
]
);
$subject->getMenu()->addChild($node);
$node = $this->nodeFactory->create(
[
'data' => [
'name' => __('CONTACT US'),
'id' => 'contactus',
'url' => 'http://www.example.com/',
'has_active' => true,
'is_active' => true // (expression to determine if menu item is selected or not)
],
'idField' => 'id',
'tree' => $subject->getMenu()->getTree()
]
);
$subject->getMenu()->addChild($node);
$node = $this->nodeFactory->create(
[
'data' => [
'name' => __('CATALOG DOWNLOAD'),
'id' => 'catalogdownload',
'url' => 'http://www.example.com/',
'has_active' => true,
'is_active' => true // (expression to determine if menu item is selected or not)
],
'idField' => 'id',
'tree' => $subject->getMenu()->getTree()
]
);
$subject->getMenu()->addChild($node);
}
}
Antworten:
In Ihrem Code ist eine kleine Änderung des Bitcodes erforderlich.
Öffnen Sie Ihren
di.xml
dann setzensortOrder="-1"
Mit diesem
sortOrder="[NumericValue]"
Tag können Sie die Reihenfolge der Ausführung des Plugins für dieselbe Methode festlegen.Grund:
Magento fügt Kategorien im Menü hinzu, indem ein Plugin derselben Klasse in Magento_Catalog verwendet wird .
Sollte Ihr Plugin also vor diesem Standard-Plugin ausgeführt werden
catalogTopmenu
, wissen wir, dass die Reihenfolge der Plugins über das sortOrder- Feld verwaltet werden kann .Dass du sortOrder deines Plugins negativ setzen musst als
catalogTopmenu
.Auch wenn Sie keine Sortierreihenfolge in das Plugin einfügen, bedeutet dies, dass der sortOrer- Wert sein sollte
0
.Aus diesem Grund schlage ich vor, sortOrder auf -1 zu setzen.
quelle
Ich denke, dass Sie in diesem Fall Observer verwenden können.
Hersteller / Magento / Modul-Thema / Block / Html / Topmenu.php
page_block_html_topmenu_gethtml_before
undpage_block_html_topmenu_gethtml_after
sind die Ereignisse, die Sie verwenden müssen.quelle
Leider verarbeitet die
addChild
Funktion der Klasse\Magento\Framework\Data\Tree\Node
die Position nicht irgendwie. Deshalb werden sie durch Hinzufügen von Knoten unmittelbar vor dem Rendern an die bereits festgelegten Knoten angehängt.Wenn man vorübergehend vorhandene Knoten in einer Variablen speichern und Knoten in der gewünschten Reihenfolge erneut anhängen könnte
Ich hoffe es hilft !
quelle
Ich denke, dies ist der einfachste Weg, um Links in Ihr Hauptmenü einzufügen.
Überschreiben Sie die Datei topmenu.phtml in Ihrem Thema wie folgt:
und fügen Sie diesen Code hinzu:
Anschließend erstellen Sie in Admin zwei Blöcke mit Ihren benutzerdefinierten Links:
before_topmenu
after_topmenu
Ich hoffe es hilft!
quelle