Ich versuche, die Reihenfolge der Registerkarten auf der Produktseite in Magento 2 zu ändern. Standard ist Details|More Information|Reviews
.
Ich habe es versucht:
Anbieter / theme / Magento_Catalog / layout / catalog_product_view.xml
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<move element="product.info.description" destination="product.info.details" after="-" />
</body>
</page>
Aber das funktioniert nicht und das ist die empfohlene Methode zum Verschieben von Elementen. Ich konnte die Registerkarten aus dem Registerkartenbereich in andere Bereiche verschieben und neue Registerkarten hinzufügen, aber die Reihenfolge der Registerkarten nicht steuern.
Ich vermute, dass es etwas damit zu tun hat group="detailed_info"
; Es sieht so aus, als würde Magento die Layout-Elemente mit diesem Attribut in der XML-Datei erfassen und durchlaufen, um die Registerkarten zu erstellen.
Gibt es eine Möglichkeit, die Reihenfolge der Registerkarten zu ändern, ohne das Modul neu zu schreiben?
Antworten:
Mein Ansatz ist ein wenig anders, aber wahrscheinlich zukunftssicherer, wenn ich später neue Registerkarten hinzufüge und die Priorität / Reihenfolge dieser Registerkarten ändere.
Ich habe für jede Registerkarte ein Argument über die XML-Datei in der XML-Themendatei übergeben
Die XML-Datei für meine Designs sieht also ungefähr so aus:
Desweiteren müssen wir das anpassen
details.phtml
, also kopiere es abzu
Bitte beachten Sie, dass die
details.phtml
Magento-Version in zukünftigen Magento-Versionen oder Patches geändert werden kann. Diese Änderungen sollten auch auf Ihre Themen angewendet werdendetails.phtml
Wir müssen jetzt die Priorität erhalten, die wir über die XML-Datei weitergeleitet haben.
Sie sehen also: Sie müssen nur ein paar Zeilen hinzufügen und können jederzeit die Priorität / Reihenfolge der Registerkarten über die XML-Datei ändern, Sie müssen die
details.phtml
in Zukunft nicht mehr ändern .quelle
In diesem Fall hilft es nicht, die Position der Registerkarte auf der Detailseite zu ändern, wenn Sie die XML-Konfigurationsdatei nach oder vor dem Attribut verwenden.
Sie müssen von der Vorlagendatei wechseln.
Kopieren Sie die Datei details.phtml vom Core in Ihr Theme.
In dieser Datei können Sie alle Registerkarten holen Namen, print_r ($ detailedInfoGroup) Sie haben wie zu bekommen Wert,
Sie müssen entsprechend Ihrer Anforderung in einem neuen Array festlegen, bevor Sie in einer Datei suchen.
hinzufügen
<?php foreach ($newOrderTab as $name):?>
,Der vollständige Code in der Datei details.phtml ist wie folgt:
quelle
In
sort_order
"app/design/frontend/Packagename/themename/Magento_Catalog/layout/catalog_product_view.xml
" Magento 2.3.1 oder höher können wir Argumente in der XML - Konfiguration verwendenAchte auch darauf, die Methode zu aktualisieren. "
getGroupChildNames
" mit "getGroupSortedChildNames
" in der Vorlagendatei ( wenn Sie sie überschreiben ) "app/design/frontend/Packagename/themename/Magento_Catalog/templates/product/view/details.phtml
".Alte Methode
Aktualisierte Methode
Wenn Sie eine
Magento\Catalog\Block\Product\View\Details.php
Blockklasse überschreiben , sollte "getGroupSortedChildNames
" Ihre Blockklasse auch diese aktualisierte Methode haben .quelle
Ein anderer Weg mit Sortierreihenfolge Argument.
Dateipfad -
app\design\frontend\<companyNAme>\<ThemeName>\Magento_Catalog\layout\catalog_product_view.xml
Fügen Sie das Argument für die Sortierreihenfolge im Blockcontainer product.info.details hinzu.
Beispielcode
Ändern Sie den Sortierreihenfolgen-Argumentwert gemäß Ihrer Bestellung in 10, 20, 30.
quelle
sort_order
war wichtig für mich, +1 machte meinen Tag :)Ich weiß, dass es andere Antworten auf diese Frage gegeben hat, aber alle waren zu invasiv für meinen Geschmack. Mit Blick auf das Problem fügt Magento einem Element ein separates "Gruppen" -Attribut hinzu und fügt diesem Attribut untergeordnete Elemente in der Reihenfolge hinzu, in der sie im Layout geladen sind, und zwar völlig getrennt von dem untergeordneten Array, das das sortierte Array von Elementen enthält. Um dies zu beheben, habe ich ein einfaches Around-Plugin geschrieben, das die Sortierung beim Abrufen von untergeordneten Gruppen korrigiert:
Auf diese Weise können Sie die Registerkarten nun wie erwartet unter Verwendung des Standards
before
und derafter
Attribute in Layout-XML anordnen und müssen in zukünftigen Magento-Patches möglicherweise nicht mehr geändert werden.quelle
Ich denke, Sie müssen sie nur in der Reihenfolge Ihrer Wahl hinzufügen. Für mich verwende ich 4 Registerkarten in dieser Reihenfolge:
In meinem benutzerdefinierten Modul habe ich folgende Layoutdatei erstellt: catalog_product_view.xml mit folgendem Inhalt:
Sie können sehen, dass ich nur 3 Registerkarten hinzugefügt habe, da die Registerkarte "Details" bereits vorhanden ist. Als Ergebnis habe ich die Registerkarten in dieser Reihenfolge erhalten:
Das ist nicht das, was ich wollte, jetzt besteht meine Lösung darin, auch die Registerkarte Details wieder hinzuzufügen, sodass meine Layoutdatei folgendermaßen aussehen würde:
Jetzt habe ich die Bestellung, die ich will :)
quelle
Der einfachste und beste Weg ist meiner Meinung nach die Lösung von LordZardeck mit einem Plugin. Nach dem Update des Herstellers / module / etc / frontend / di.xml
alles hat wie gewünscht funktioniert.
Danke @LordZardeck für den sauberen Code!
quelle
Hier ist die Lösung, die ich verwendet habe. Die Registerkarte Beschreibung und Attribute werden ausgetauscht, wenn beide verfügbar sind. Dies ist das Ultimo-Thema. Aber Sie werden es verstehen. KUSS.
quelle
Meine Lösung für das Problem besteht darin, die Vorlage details.phtml so zu ändern, dass die untergeordneten Blöcke aus dem Layout entfernt werden.
$blocks = $layout->getChildBlocks($block->getNameInLayout());
Auf diese Weise wird die Reihenfolge eingehalten, die von den After- und Before- Modifikatoren vorgegeben wurde .
Ich verwende immer noch das von getGroupChildNames bereitgestellte Array, um zu überprüfen , ob der Block zur Gruppe gehört.
if(in_array($child_block->getNameInLayout(),$detailedInfoGroup))
quelle
Ich wollte nicht an dem Thema arbeiten, sondern das Verhalten der Methode 'getGroupChildNames' ändern. Dieser Ansatz sollte auch dann funktionieren, wenn die Vorlage geändert wird.
Ich habe Folgendes zu catalog_product_view.xml hinzugefügt:
Erstellen Sie dann einen Block, um das Verhalten von 'getGroupChildNames' zu ändern:
Das ist alles.
quelle
LordZardeck hat die beste Antwort, aber dies ist im Grunde ein Fehler und sollte im Kern behoben werden.
Die einfachste Lösung für das gefundene Problem ist folgende: Überschreiben Sie die Vorlage Magento_Catalog :: product / view / details.phtml und nach der ersten PHP-Bedingung in Zeile 10:
Fügen Sie folgenden Code hinzu, um die Reihenfolge zu ändern:
Dadurch wird die Reihenfolge geändert, und alle in $ _prepend aufgeführten Registerkarten werden in der festgelegten Reihenfolge an den Anfang des Arrays verschoben .
quelle
Es sieht so aus, als ob all das nicht mehr relevant ist. Ab Magento 2.3.1 können wir
sort_order
argument in xml config verwenden.quelle
Ein Plugin ist eine schöne Lösung. Aber Sie können es noch verbessern. Sie möchten nicht jedes Mal ein anderes Plugin schreiben, wenn Sie die Tabs neu anordnen müssen. Sie möchten die Reihenfolge in XML festlegen. So was:
Anstatt die Vorlage zu ändern, erstellen Sie ein Plugin, mit dem Magento das
priority
in xml config verwendete Argument versteht :Und schließlich muss das Plugin auf die
Magento\Catalog\Block\Product\View\Description
Klasse in der Datei di.xml angewendet werden.quelle
Ändern Sie für Magento 2 die Reihenfolge der Registerkarten auf der Produktseite.
Sie können die Reihenfolge der Registerkarten auf einfache Weise anpassen.
Wenn die Datei details.phtml bereits vorhanden ist, aktualisieren Sie sie.
Originalcode:
Nach dem Hinzufügen des Codes:
Und fügen Sie benutzerdefinierte Registerkarte in der Produktseite überprüfen Sie diesen Link
Magento 2 - Produktregisterkarte erstellen, auf der benutzerdefinierte Attribute angezeigt werden
quelle