Ordem de classificação de atributos do produto configurável no menu suspenso 2.12

9

A ordem do menu suspenso não é consistente com a ordem do próprio atributo. Dentro do tamanho do atributo, solicitei Recém-nascido 0-3 meses

e no menu suspenso aparece como 0-3 recém-nascido

o tamanho Recém-nascido foi adicionado alguns dias após os outros tamanhos e os produtos simples para recém-nascidos foram importados após o mês 0-3. Alguma sugestão de como obter a ordem do menu suspenso para seguir a ordem da lista dentro do atributo? Limpei o cache e reindexei. Eu li que @Khoa TruongDinh tinha o mesmo problema, mas não vi uma solução para o problema, então estou reposicionando.

babywit
fonte
Além disso, os produtos de atributo com tamanho 0-3 já existem e estou adicionando todos os produtos de atributo com tamanho Recém-nascido.
21816 babywit #

Respostas:

14

Eu enfrentei o mesmo problema de classificação de opções de atributo no front-end. Como verifiquei esse problema e descobri que, ao buscar as opções de atributo, não há nenhum filtro de classificação adicionado à consulta por padrão no Magento 2.1.2. Portanto, para corrigir esse problema, é necessário para adicionar o código abaixo para adicionar o ORDER By na função getAttributeOptions na linha 282 no arquivo: vendor / magento / product-configurable-module / Model / ResourceModel / Product / Type / Configurable.php Agora, está funcionando bem para mim.

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

Se não for possível editar o código, substitua esta função getAttributeOptions pelo código abaixo:

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);
}
Jagdish Ram
fonte
muito obrigado por isso, mas eu não sou bem versado em php. Não tenho certeza de onde adicionar sua correção. Isto é o que eu tenho do 280-282 e tentei adicioná-lo antes do; em 282, mas isso não funcionou. 280 'attribute.attribute_id =?', 281 $ superAttribute-> getAttributeId () 282);
babywit
se você não conseguir editar o código, substitua-o por
Jagdish Ram 22/11
Alguém escreveu uma extensão que aplica esse patch?
TheNorthern_Light
Além disso, isso não parece funcionar no 2.1.9.
TheNorthern_Light
Na versão 2.1.14, a funcionalidade foi movida para Magento\ConfigurableProduct\Model\AttributeOptionProvider. Parece resolvido à primeira vista, embora não tenha certeza sobre possíveis erros.
Simonthesorcerer
3
  1. Vá para a página do produto configurável -> Editar configuração -> clique em Avançar - Avançar - Avançar e não altere nada
  2. Em seguida, salve o produto e eles devem estar em ordem.
Sebastian Tomic
fonte
Atualizar ou salvar o produto?
Lasantha 23/05/19
Como fazer isso com mais de 300 produtos?
Mohammed Joraid
Na verdade, apenas abrir a página de edição do produto configurável e salvar apenas corrige diretamente a ordem de classificação. Então 1- Abra o produto 2- Clique em Salvar. Mas como fazer isso funcionar sem acessar todos os produtos manualmente e salvá-los. Tentei adicionar em massa todo o produto ao site, esperando que ele acione um evento de salvamento, mas a classificação não foi corrigida. usando MAG2.2.2
Mohammed Joraid
1

Se você quer dizer que Recém-nascido é um valor de atributo, você precisa ir para Lojas -> Atributos (Produto) , encontrar o atributo necessário e também usar arrastar e soltar com o mouse, mudar a posição das opções. insira a descrição da imagem aqui

A posição dos menus suspensos (tamanho, cor, forma) pode ser definida ao gerar produtos associados. Abra o formulário de edição -> Configurações avançadas -> Configurações de edição - Etapa de valores dos atributos e com a ajuda dos atributos de arrastar e soltar insira a descrição da imagem aqui

Lilian Rameriz
fonte
Sim, exatamente. "Dentro do tamanho do atributo, solicitei ao recém-nascido 0-3 meses" Portanto, dentro do próprio atributo Recém-nascido está ACIMA de 0-3 meses e, no menu suspenso do produto, aparece com 0-3 meses ACIMA de Recém-nascido.
babywit
Assim, tanto quanto eu posso dizer, a ordem dentro do próprio atributo não está funcionando corretamente no Magento 2.1.2
babywit
Alguém tem alguma idéia do que está causando esse problema com a ordem dos atributos que não aparecem na ordem listada no atributo ou em uma solução alternativa para que os atributos apareçam na ordem correta? Quero lançar minha loja, mas isso está me deixando maluco.
Novinhas
1

Atualmente, esse é um problema conhecido no Magento 2. Ele ainda é um problema a partir da versão 2.1.4.

Aqui está a questão do GitHub: https://github.com/magento/magento2/issues/7441

dmatthew
fonte
A pergunta foi feita há 3 meses. Magento 2.1.4 foi lançado ontem ...
7ochem 8/17
1

Como esse problema ainda está presente também na versão mais recente 2.1.7, você pode usar esta solução alternativa:

Vá para a página configurável do produto-> Configurações-> remova todos os produtos simples

Depois disso, adicione-os novamente na ordem desejada:

Adicione produtos manualmente-> Filtre produtos por nome-> Adicione produtos simples na ordem desejada.

Alain Banutz
fonte
1

Na v2.3.x, você pode classificar a ordem dos atributos por rótulo de opção em um seletor suspenso de produto configurável, estendendo

Magento\ConfigurableProduct\Model\AttributeOptionProvider

e usando

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

Para classificar a matriz de dados da opção retornada $ data em getAttributeOptions ()

paj
fonte
você pode elaborar mais?
Kowsigan Atsayam 13/03