Estoy tratando de cambiar el orden de las pestañas en la página del producto en Magento 2. El valor predeterminado es Details|More Information|Reviews
.
Lo intenté:
Proveedor / tema / 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>
Pero eso no funciona, y esa es la forma recomendada para mover elementos. Pude mover las pestañas fuera del área de pestañas a otras áreas, así como agregar nuevas pestañas, pero no puedo controlar el orden de las pestañas.
Mi conjetura es que tiene algo que ver con group="detailed_info"
; Parece que Magento toma los elementos de diseño con este atributo en el XML y lo recorre para crear las pestañas.
¿Hay alguna manera de cambiar el orden de las pestañas sin reescribir el módulo?
Respuestas:
Mi enfoque es un poco diferente, pero probablemente más a prueba de futuro, en caso de agregar nuevas pestañas más adelante y cambiar la prioridad / orden de estas pestañas.
Pasé un argumento para cada pestaña a través del archivo XML en mi archivo XML de temas
Entonces mi archivo XML de temas se ve así:
Además, tenemos que ajustar el
details.phtml
, así que cópielo dea
Tenga en cuenta que el propio
details.phtml
Magento podría cambiarse en futuras versiones o parches de Magento. Estos cambios también deberían aplicarse a los temas de su tema.details.phtml
Ahora necesitamos obtener la prioridad que transmitimos a través del archivo XML.
Como puede ver: solo tiene que agregar algunas líneas y siempre puede cambiar la prioridad / orden de las pestañas a través del archivo xml, ya no tiene que cambiar el
details.phtml
en el futuro.fuente
Para Cambiar la posición de la pestaña en la página de detalles, el uso del archivo de configuración XML después o antes del atributo no ayuda en este caso.
Tienes que cambiar del archivo de plantilla.
Copie el archivo details.phtml del núcleo a su tema,
Dentro de este archivo, puede buscar el nombre de todas las pestañas usando, print_r ($ updatedInfoGroup) tiene que obtener un valor como,
Debe establecer de acuerdo con sus requisitos en una nueva matriz antes de foreach en el archivo,
añadir
<?php foreach ($newOrderTab as $name):?>
,El código completo en details.phtml es como a continuación,
fuente
En Magento 2.3.1 o superior podemos usar
sort_order
argumentos en "app/design/frontend/Packagename/themename/Magento_Catalog/layout/catalog_product_view.xml
" xml configTambién asegúrese de actualizar el método "
getGroupChildNames
" con "getGroupSortedChildNames
" en el archivo de plantilla ( si lo está anulando ) "app/design/frontend/Packagename/themename/Magento_Catalog/templates/product/view/details.phtml
".Método antiguo
Método actualizado
Si está anulando la
Magento\Catalog\Block\Product\View\Details.php
clase de bloque, entonces su clase de bloque también debería tener ese método actualizado "getGroupSortedChildNames
".fuente
Otra forma de usar el argumento de orden de clasificación.
Ruta de archivo -
app\design\frontend\<companyNAme>\<ThemeName>\Magento_Catalog\layout\catalog_product_view.xml
Agregue el argumento de orden de clasificación dentro del contenedor de bloques de referencia product.info.details.
Código de ejemplo
Cambie el valor del argumento de orden de clasificación a 10, 20, 30 según su orden.
fuente
sort_order
fue importante para mí, +1 meSé que ha habido otras respuestas a esta pregunta, pero todas fueron demasiado invasivas para mi gusto. Al analizar el problema, Magento agrega un atributo de "grupo" separado a un elemento y agrega elementos secundarios a ese atributo en el orden cargado en el diseño, completamente separado del conjunto de elementos secundarios que contiene el conjunto ordenado de elementos. Para solucionar esto, escribí un plugin simple que soluciona la clasificación al recuperar hijos del grupo:
Esto ahora le permitirá ordenar las pestañas usando el estándar
before
y losafter
atributos en el diseño XML como es de esperar, y probablemente no necesitará ser modificado en futuros parches de Magento.fuente
Creo que solo necesita agregarlos en el orden que elija. Para mí, estoy usando 4 pestañas en este orden:
En mi módulo personalizado creé este archivo de diseño: catalog_product_view.xml con este contenido:
Puede ver que he agregado solo 3 pestañas porque la pestaña de detalles ya existe. Como resultado, obtuve las pestañas en este orden:
Lo cual no es lo que quería, ahora mi solución a esto es agregar también la pestaña Detalles nuevamente, para que mi archivo de diseño sea así:
Ahora tengo el pedido que quiero :)
fuente
La mejor y más fácil es, en mi opinión, la solución de LordZardeck con un complemento. Después de actualizar el proveedor / módulo / etc / frontend / di.xml
Todo funcionó como se desea.
¡Gracias @LordZardeck por el código limpio!
fuente
Aquí está la solución que usé. Intercambiará la descripción y la pestaña de atributos si ambos están disponibles. Esto está usando el tema Ultimo. Pero entenderás el punto. BESO.
fuente
Mi solución al problema es modificar la plantilla details.phtml para que obtenga los bloques secundarios del diseño.
$blocks = $layout->getChildBlocks($block->getNameInLayout());
Al hacerlo de esta manera, respeta el orden dado por los modificadores after y before .
Todavía uso la matriz proporcionada por getGroupChildNames para validar si el bloque pertenece al grupo.
if(in_array($child_block->getNameInLayout(),$detailedInfoGroup))
fuente
No quería trabajar en el tema, quería modificar el comportamiento del método 'getGroupChildNames'. Este enfoque debería funcionar incluso si la plantilla se modifica.
Agregué esto a catalog_product_view.xml:
Luego, cree un bloque para cambiar el comportamiento de 'getGroupChildNames':
Eso es todo.
fuente
LordZardeck tiene la mejor respuesta, pero esto es básicamente un error y debe solucionarse en el núcleo.
La solución más simple al problema que encontré es la siguiente: Anule la plantilla Magento_Catalog :: product / view / details.phtml y después de la primera condición de php en la línea 10:
agregue el siguiente código para modificar el orden:
esto cambiará el orden y empujará todas las pestañas enumeradas en $ _prepend al comienzo de la matriz en el orden definido.
fuente
Parece que todo lo anterior ya no es relevante. A partir de Magento 2.3.1 podemos usar
sort_order
argumentos en la configuración xml.fuente
Un complemento es una buena solución. Pero aún puedes mejorarlo. No desea escribir un complemento diferente cada vez que necesite reordenar las pestañas. Lo que quieres hacer es establecer el orden en xml. Me gusta esto:
y luego, en lugar de modificar la plantilla, cree un complemento que haga que Magento entienda el
priority
argumento utilizado en la configuración xml:Y finalmente, el complemento debe aplicarse a la
Magento\Catalog\Block\Product\View\Description
clase en el archivo di.xml.fuente
Para Magento 2, cambie el orden de las pestañas en la página del producto.
Puede personalizar fácilmente el orden de las pestañas de forma sencilla.
Si el archivo details.phtml ya existe, actualícelo.
Código original:
Después de agregar código:
Y agregue una pestaña personalizada en la página del producto, consulte este enlace
Magento 2: crea una pestaña de producto que muestra un atributo personalizado
fuente