J'essaie de changer l'ordre des onglets sur la page du produit dans Magento 2. La valeur par défaut est Details|More Information|Reviews
.
J'ai essayé:
Fournisseur / thème / 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>
Mais cela ne fonctionne pas, et c'est la façon recommandée pour déplacer des éléments. J'ai pu déplacer les onglets hors de la zone d'onglet et dans d'autres zones, ainsi que d'ajouter de nouveaux onglets, mais je ne peux pas contrôler l'ordre des onglets.
Je suppose que cela a quelque chose à voir avec group="detailed_info"
; Il semble que Magento saisit les éléments de mise en page avec cet attribut dans le XML et les parcourt pour créer les onglets.
Existe-t-il un moyen de modifier l'ordre des onglets sans réécrire le module?
Réponses:
Mon approche est un peu différente mais probablement plus à l'épreuve du temps, en cas d'ajout de nouveaux onglets plus tard et de changement de priorité / ordre de ces onglets.
J'ai passé un argument pour chaque onglet via un fichier XML dans mon fichier XML de thèmes
Donc, mon fichier XML de thèmes ressemble à ceci:
De plus, nous devons ajuster le
details.phtml
, alors copiez-le depuisà
Veuillez garder à l'esprit que le propre de magento
details.phtml
pourrait être modifié dans les futures versions ou correctifs de Magento. Ces modifications doivent également être appliquées à votre thèmedetails.phtml
Nous devons maintenant obtenir la priorité que nous avons transmise via le fichier XML.
Vous voyez donc: il vous suffit d'ajouter quelques lignes et vous pouvez toujours changer la priorité / l'ordre des onglets via le fichier xml, vous n'avez plus besoin de changer
details.phtml
à l'avenir.la source
Pour changer la position de tabulation dans la page de détails, l'utilisation d'un fichier de configuration XML après ou avant l' attribut n'aide pas dans ce cas.
Vous devez changer de fichier modèle.
Copiez le fichier details.phtml du cœur vers votre thème,
Dans ce fichier, vous pouvez récupérer le nom de tous les onglets en utilisant, print_r ($ detailedInfoGroup), vous devez obtenir une valeur comme,
Vous devez définir en fonction de vos besoins dans un nouveau tableau avant de foreach dans le fichier,
ajouter
<?php foreach ($newOrderTab as $name):?>
,Le code complet dans details.phtml est comme ci-dessous,
la source
Dans Magento 2.3.1 ou supérieur, nous pouvons utiliser l'
sort_order
argument dans laapp/design/frontend/Packagename/themename/Magento_Catalog/layout/catalog_product_view.xml
configuration " " xmlAssurez-vous également de mettre à jour la méthode "
getGroupChildNames
" avec "getGroupSortedChildNames
" dans le fichier modèle ( si vous la remplacez ) "app/design/frontend/Packagename/themename/Magento_Catalog/templates/product/view/details.phtml
".Ancienne méthode
Méthode mise à jour
Si vous remplacez la
Magento\Catalog\Block\Product\View\Details.php
classe de bloc, votre classe de bloc doit également avoir cette méthode mise à jour "getGroupSortedChildNames
".la source
Une autre façon d'utiliser l'argument de l'ordre de tri.
Chemin du fichier -
app\design\frontend\<companyNAme>\<ThemeName>\Magento_Catalog\layout\catalog_product_view.xml
Ajoutez l'argument d'ordre de tri dans le conteneur du bloc de référence product.info.details.
Exemple de code
Modifiez la valeur de l'argument d'ordre de tri à 10, 20, 30 selon votre commande.
la source
sort_order
était importante pour moi, +1 a fait ma journée :)Je sais qu'il y a eu d'autres réponses à cette question, mais toutes étaient trop envahissantes à mon goût. En examinant le problème, Magento ajoute un attribut "groupe" distinct à un élément et ajoute des enfants à cet attribut dans l'ordre chargé dans la présentation, complètement séparé du tableau d'enfants qui contient le tableau d'éléments triés. Afin de résoudre ce problème, j'ai écrit un plugin simple around qui corrige le tri lors de la récupération des enfants du groupe:
Cela vous permettra désormais de commander les onglets en utilisant le standard
before
et lesafter
attributs dans la mise en page XML comme vous vous y attendez, et n'aura probablement pas besoin d'être modifié sur les futurs correctifs Magento.la source
Je pense que vous avez juste besoin de les ajouter dans l'ordre de votre choix. Pour moi, j'utilise 4 onglets dans cet ordre:
Dans mon module personnalisé, j'ai créé ce fichier de mise en page: catalog_product_view.xml avec ce contenu:
Vous pouvez voir que je n'ai ajouté que 3 onglets car l'onglet Détails existe déjà. En conséquence, j'ai les onglets dans cet ordre:
Ce qui n'est pas ce que je voulais, maintenant ma solution est d'ajouter à nouveau également l'onglet Détails, donc mon fichier de mise en page serait comme ceci:
Maintenant, j'ai la commande que je veux :)
la source
Le moyen le plus simple et le meilleur est à mon avis la solution de LordZardeck avec un plugin. Après la mise à jour du fournisseur / module / etc / frontend / di.xml
tout a fonctionné comme souhaité.
Merci @LordZardeck pour le code propre!
la source
Voici la solution que j'ai utilisée. Il permutera l'onglet description et attributs s'ils sont tous les deux disponibles. Ceci utilise le thème Ultimo. Mais vous aurez compris. BAISER.
la source
Ma solution au problème consiste à modifier le modèle details.phtml afin qu'il récupère les blocs enfants de la mise en page.
$blocks = $layout->getChildBlocks($block->getNameInLayout());
En procédant ainsi, il respecte l'ordre donné par les modificateurs après et avant .
J'utilise toujours le tableau fourni par getGroupChildNames afin de valider si le bloc appartient au groupe.
if(in_array($child_block->getNameInLayout(),$detailedInfoGroup))
la source
Je ne voulais pas travailler sur le thème, je voulais modifier le comportement de la méthode 'getGroupChildNames'. Cette approche devrait fonctionner même si le modèle est modifié.
J'ai ajouté ceci à catalog_product_view.xml:
Ensuite, créez un bloc pour modifier le comportement de «getGroupChildNames»:
C'est tout.
la source
LordZardeck a la meilleure réponse, mais il s'agit essentiellement d'un bug et devrait être corrigé dans le noyau.
La solution la plus simple au problème que j'ai trouvé est la suivante: Remplacez le modèle Magento_Catalog :: product / view / details.phtml et après la première condition php à la ligne 10:
ajoutez le code suivant pour modifier la commande:
cela va changer l'ordre et pousser tous les onglets répertoriés dans $ _prepend au début du tableau dans l'ordre défini.
la source
Il semble que tout ce qui précède n'est plus pertinent. Depuis Magento 2.3.1, nous pouvons utiliser l'
sort_order
argument dans la configuration xml.la source
Un plugin est une bonne solution. Mais vous pouvez toujours l'améliorer. Vous ne voulez pas écrire un plugin différent chaque fois que vous devez réorganiser les onglets. Ce que vous voulez faire, c'est définir l'ordre en xml. Comme ça:
puis, au lieu de modifier le modèle, créez un plugin qui ferait comprendre à Magento l'
priority
argument utilisé dans la configuration xml:Et enfin, le plugin doit être appliqué à la
Magento\Catalog\Block\Product\View\Description
classe dans le fichier di.xml.la source
Pour Magento 2, changez l'ordre des onglets sur la page du produit.
Vous pouvez facilement personnaliser l'ordre des onglets de manière simple.
Si le fichier details.phtml existe déjà, mettez-le à jour.
Code d'origine:
Après avoir ajouté le code:
Et ajouter un onglet personnalisé dans la page du produit vérifier ce lien
Magento 2 - Créer un onglet de produit qui affiche un attribut personnalisé
la source