Orden de clasificación de atributo de producto configurable en el menú desplegable 2.12

9

El orden del menú desplegable no es coherente con el orden del atributo en sí. Dentro del tamaño del atributo lo he ordenado Newborn 0-3 mo

y en el menú desplegable aparece como 0-3 Recién nacido

El tamaño de Recién nacido se agregó unos días después de los otros tamaños y los productos simples para recién nacidos se importaron después de los 0-3 meses. ¿Alguna sugerencia de cómo obtener el orden del menú desplegable para seguir el orden de la lista dentro del atributo? He borrado el caché y reindexado. Leí que @Khoa TruongDinh tenía el mismo problema pero no veía una solución al problema, así que estoy volviendo a publicar.

babywit
fuente
Además, los productos de atributo con tamaño 0-3 ya existen y estoy agregando todos los productos de atributo con tamaño recién nacido.
babywit

Respuestas:

14

Me enfrenté al mismo problema de clasificación de opciones de atributo en el front-end, ya que revisé este problema y descubrí que al buscar las opciones de atributo, no hay un filtro de clasificación agregado en la consulta de forma predeterminada en Magento 2.1.2, por lo que para solucionar este problema es necesario para agregar el siguiente código para agregar el ORDER By en la función getAttributeOptions en la línea no 282 en el archivo: vendor / magento / module-configurable-product / Model / ResourceModel / Product / Type / Configurable.php Ahora, está funcionando bien para mí.

->joinInner(
        ['attribute_opt' => $this->getTable('eav_attribute_option')],
        'attribute_opt.option_id = entity_value.value',
        []
    )->order(
        'attribute_opt.sort_order ASC'
    );

Si no puede editar el código, reemplace esta función getAttributeOptions con el código siguiente:

public function getAttributeOptions($superAttribute, $productId)
{
    $scope  = $this->getScopeResolver()->getScope();
    $select = $this->getConnection()->select()->from(
        ['super_attribute' => $this->getTable('catalog_product_super_attribute')],
        [
            'sku' => 'entity.sku',
            'product_id' => 'product_entity.entity_id',
            'attribute_code' => 'attribute.attribute_code',
            'value_index' => 'entity_value.value',
            'option_title' => $this->getConnection()->getIfNullSql(
                'option_value.value',
                'default_option_value.value'
            ),
            'default_title' => 'default_option_value.value',
        ]
    )->joinInner(
        ['product_entity' => $this->getTable('catalog_product_entity')],
        "product_entity.{$this->getProductEntityLinkField()} = super_attribute.product_id",
        []
    )->joinInner(
        ['product_link' => $this->getTable('catalog_product_super_link')],
        'product_link.parent_id = super_attribute.product_id',
        []
    )->joinInner(
        ['attribute' => $this->getTable('eav_attribute')],
        'attribute.attribute_id = super_attribute.attribute_id',
        []
    )->joinInner(
        ['entity' => $this->getTable('catalog_product_entity')],
        'entity.entity_id = product_link.product_id',
        []
    )->joinInner(
        ['entity_value' => $superAttribute->getBackendTable()],
        implode(
            ' AND ',
            [
                'entity_value.attribute_id = super_attribute.attribute_id',
                'entity_value.store_id = 0',
                "entity_value.{$this->getProductEntityLinkField()} = "
                . "entity.{$this->getProductEntityLinkField()}",
            ]
        ),
        []
    )->joinLeft(
        ['option_value' => $this->getTable('eav_attribute_option_value')],
        implode(
            ' AND ',
            [
                'option_value.option_id = entity_value.value',
                'option_value.store_id = ' . $scope->getId(),
            ]
        ),
        []
    )->joinLeft(
        ['default_option_value' => $this->getTable('eav_attribute_option_value')],
        implode(
            ' AND ',
            [
                'default_option_value.option_id = entity_value.value',
                'default_option_value.store_id = ' . \Magento\Store\Model\Store::DEFAULT_STORE_ID,
            ]
        ),
        []
    )->where(
        'super_attribute.product_id = ?',
        $productId
    )->where(
        'attribute.attribute_id = ?',
        $superAttribute->getAttributeId()
    )->joinInner(
        ['attribute_opt' => $this->getTable('eav_attribute_option')],
        'attribute_opt.option_id = entity_value.value',
        []
    )->order(
        'attribute_opt.sort_order ASC'
    );

    return $this->getConnection()->fetchAll($select);
}
Ram Jagdish
fuente
Muchas gracias por esto, pero no estoy bien versado en PHP. No estoy seguro de dónde agregar su solución. Esto es lo que tengo de 280-282 e intenté agregarlo antes de; en 282 pero esto no funcionó. 280 'attribute.attribute_id =?', 281 $ superAttribute-> getAttributeId () 282);
babywit
si no puede editar el código, reemplácelo
Jagdish Ram
¿Alguien ha escrito una extensión que aplique este parche?
TheNorthern_Light
Además, esto no parece funcionar en 2.1.9.
TheNorthern_Light
En 2.1.14 la funcionalidad se ha movido a Magento\ConfigurableProduct\Model\AttributeOptionProvider. Parece resuelto a primera vista, aunque no estoy seguro de posibles errores.
simonthesorcerer
3
  1. Vaya a la página de Producto configurable -> Editar configuración -> Haga clic en siguiente - siguiente - siguiente y no cambie nada
  2. Luego guarde el producto y deben estar en orden.
Sebastian Tomic
fuente
¿Actualizar o guardar el producto?
Lasantha
¿Cómo hacer eso con más de 300 productos?
Mohammed Joraid
En realidad, solo abrir la página de edición del producto configurable y luego simplemente guardar corrige directamente el orden de clasificación. Entonces 1- Abra el producto 2- Haga clic en guardar. Pero cómo hacer que esto funcione sin tener que ir a todos los productos manualmente y guardarlos. Traté de agregar todos los productos al sitio de forma masiva con la esperanza de que desencadene un evento de guardar, pero el tipo no se solucionó. usando MAG2.2.2
Mohammed Joraid
1

Si quiere decir que Newborn es el valor del atributo, debe ir a Tiendas -> Atributos (Producto) , encontrar el atributo necesario y también usar arrastrar y soltar con el mouse para cambiar la posición de las opciones. ingrese la descripción de la imagen aquí

La posición de los menús desplegables (tamaño, color, forma) se puede establecer al generar productos asociados. Abrir formulario de edición -> Configuración avanzada -> Editar configuraciones - Paso de valores de atributo y con la ayuda de arrastrar y soltar atributos de movimiento ingrese la descripción de la imagen aquí

Lilian Rameriz
fuente
Sí exactamente. "Dentro del tamaño del atributo lo he ordenado Recién nacido 0-3 meses" Entonces, dentro del atributo en sí, el Recién nacido está POR ARRIBA 0-3 meses y en el menú desplegable del producto aparece con 0-3 meses POR ENCIMA del Recién nacido.
babywit
Por lo que puedo decir, el orden dentro del atributo en sí no funciona correctamente en magento 2.1.2
babywit
¿Alguien tiene alguna idea de qué está causando este problema con el orden de los atributos que no se muestran en el orden indicado en el atributo o una solución alternativa para que los atributos se muestren en el orden correcto? Quiero abrir mi tienda pero esto me está volviendo loco.
babywit
1

Actualmente es un problema conocido en Magento 2. Todavía es un problema a partir de la versión 2.1.4.

Aquí está el problema de GitHub: https://github.com/magento/magento2/issues/7441

dmatthew
fuente
La pregunta se hizo hace 3 meses. Magento 2.1.4 fue lanzado ayer ...
7ochem
1

Debido a que este problema todavía está presente también en la última versión 2.1.7, puede utilizar esta solución alternativa:

Vaya a la página de productos configurables-> Configuraciones-> elimine todos los productos simples

Después de eso, agréguelos nuevamente en el orden deseado:

Agregar productos manualmente-> Filtrar productos por nombre-> Agregar productos simples en el orden deseado.

Alain Banutz
fuente
1

En v2.3.x puede ordenar el orden de los atributos por etiqueta de opción en un selector desplegable de productos configurable extendiendo

Magento\ConfigurableProduct\Model\AttributeOptionProvider

y usando

usort($data, function($a, $b) {
    return $a['option_title'] <=> $b['option_title'];
});

Para ordenar la matriz de datos de opción devuelta $ data en getAttributeOptions ()

paj
fuente
¿Puedes elaborarlo más?
Kowsigan Atsayam