Magento 2: Wie sortiere ich die Reihenfolge der benutzerdefinierten Links Navi?


7

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);
    }


}

Danke, dass du den Code in der Frage
geschert hast.

Antworten:


5

In Ihrem Code ist eine kleine Änderung des Bitcodes erforderlich.

Öffnen Sie Ihren di.xmldann setzensortOrder="-1"

Mit diesem sortOrder="[NumericValue]"Tag können Sie die Reihenfolge der Ausführung des Plugins für dieselbe Methode festlegen.

Plugin sortOrder: Die Reihenfolge, in der Plugins ausgeführt werden, die dieselbe Methode aufrufen. Siehe http://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html

Grund:

Magento fügt Kategorien im Menü hinzu, indem ein Plugin derselben Klasse in Magento_Catalog verwendet wird .

 <type name="Magento\Theme\Block\Html\Topmenu">
     <plugin name="catalogTopmenu" type="Magento\Catalog\Plugin\Block\Topmenu" /> 
 </type>

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.


0

Ich denke, dass Sie in diesem Fall Observer verwenden können.

Hersteller / Magento / Modul-Thema / Block / Html / Topmenu.php

page_block_html_topmenu_gethtml_beforeund page_block_html_topmenu_gethtml_aftersind die Ereignisse, die Sie verwenden müssen.


0

Leider verarbeitet die addChildFunktion der Klasse \Magento\Framework\Data\Tree\Nodedie Position nicht irgendwie. Deshalb werden sie durch Hinzufügen von Knoten unmittelbar vor dem Rendern an die bereits festgelegten Knoten angehängt.

/**
 * Add child node
 *
 * @param   Node $node
 * @return  Node
 */
public function addChild($node)
{
    $this->_childNodes->add($node);
    return $this;
}

Wenn man vorübergehend vorhandene Knoten in einer Variablen speichern und Knoten in der gewünschten Reihenfolge erneut anhängen könnte

$children = $subject->getMenu()->getChildren();
//then delete them using removeChild() (one by one) or by creating a new parent node

//add here your first childNode
foreach ($children as $child) {
    $this->addChild($child);
}
//add here your last custom childNode

Ich hoffe es hilft !


-1

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:

app/design/frontend/Vendor/themename/Magento_Theme/templates/html/topmenu.phtml

und fügen Sie diesen Code hinzu:

<?php $columnsLimit = $block->getColumnsLimit() ?: 0; ?>
<?php $_menu = $block->getHtml('level-top', 'submenu', $columnsLimit) ?>
<?php $_custom_menu_before = $this->getLayout()->createBlock('Magento\Cms\Block\Block')->setBlockId('before_topmenu')->toHtml();?>
<?php $_custom_menu_after = $this->getLayout()->createBlock('Magento\Cms\Block\Block')->setBlockId('after_topmenu')->toHtml();?>

<nav class="navigation" data-action="navigation">
    <ul data-mage-init='{"menu":{"responsive":true, "expanded":true, "position":{"my":"left top","at":"left bottom"}}}'>
        <?php /* @escapeNotVerified */ echo $_custom_menu_before; ?>
        <?php /* @escapeNotVerified */ echo $_menu; ?>
        <?php /* @escapeNotVerified */ echo $block->getChildHtml(); ?>
        <?php /* @escapeNotVerified */ echo $_custom_menu_after; ?>
    </ul>
</nav>

Anschließend erstellen Sie in Admin zwei Blöcke mit Ihren benutzerdefinierten Links:

before_topmenu

after_topmenu

Ich hoffe es hilft!


1
Kein guter Ansatz, um Vorlagen zu überschreiben und CMS-Blöcke in * .phtml-Dateien zu erstellen.
Miroslav Petroff
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.