Consulta de filtro de atributo da lista de produtos

12

Eu adicionei um filtro no método _getProductCollection() da classe da Mage_Catalog_Block_Product_List seguinte maneira.

protected function _getProductCollection()
{
     ...
    $this->_productCollection = $layer->getProductCollection();
    $this->_productCollection->getSelect()->joinInner(
        array('cpe' => 'catalog_product_entity'),
        'e.entity_id = cpe.entity_id'
    ) 
    ->where("cpe.type_id = 'simple'"); 
    ...
}

O código acima está funcionando bem a partir da versão 1.7 do Magento. Mas sempre que eu escrevo o código a seguir, ele fornece

Coluna não encontrada: 1054 Coluna desconhecida 'e.type_id' na 'cláusula where'

erro.

O código (que não está funcionando).

protected function _getProductCollection()
{
     ...
    $this->_productCollection = $layer->getProductCollection();
    $this->_productCollection
        ->addAttributeToSelect('type_id')
        ->addAttributeToFilter('type_id','simple');
    ...
}

Agora as perguntas .

  1. Haverá algum impacto no desempenho se eu usar o primeiro código de trabalho?
  2. existe alguma outra maneira de obter um filtro de produto adequado?

ATUALIZAR:

Sempre que aplico o código a seguir e uso o rwdtema, não estou recebendo nenhum erro. Mas sempre que eu uso o defaulttema, recebo o erro abaixo,

Código

protected function _getProductCollection()
{
     ...
    $this->_productCollection = $layer->getProductCollection();
    $this->_productCollection
         ->addAttributeToSelect('type_id')
         ->addAttributeToFilter('type_id','simple');
    ...
}

Erro

SQLSTATE [42S22]: Coluna não encontrada: 1054 Coluna desconhecida 'e.type_id' na cláusula 'where', a consulta foi: SELECT FLOOR ((ROUND ((e.min_price) * 1, 2)) / 10) + 1 AS range, CONTAGEM (*) A countPARTIR catalog_product_index_priceDO e INTERIOR ASSINATURA catalog_category_product_indexCOMO cat_indexCAT_index.product_id = e.entity_id AND cat_index.store_id = 1 AND cat_index.visibility IN (2, 4) AND cat_index.category_id = '3' ONDE ( e. type_idIN ('simples' )) AND (e.website_id = '1') AND (e.customer_group_id = 0) AND (e.min_price NÃO É NULL) GRUPO POR ANDAR ((ROUND ((e.min_price) * 1, 2)) / 10) + 1 PEDIDO POR ANDAR ((ROUND ((e.min_price) * 1, 2)) / 10) + 1 ASC

Magento Learner
fonte
qual versão do magento vc usa ?? * & aplicamos patches de magento
Amit Bera
1
wtf? agora faz sentido ... eu estava testando um EE 1.14 no RWD, isso é inaceitável, como um tema de exibição pode alterar uma consulta inteira ainda pior, como pode alterar a tabela principal ... isso não poderia ser nada além de um bug . Bem feito @Magento Learner!
MauroNigrele
Exatamente, o tema da visualização cria um problema. obrigado. O código deve ser independente de um tema
Magento Learner

Respostas:

0

Eu penso isso:

$collection->addAttributeToFilter('type_id', array('eq' => 'simple');

Deve funcionar, você não precisa adicionar type_iduma selectvez que é uma catalog_product_entitycoluna e ela é recuperada por padrão. Eu sempre sugiro registrar a consulta final para ter uma melhor idéia do que está acontecendo:

Mage.:log($collection->getSelectSql(true));

BTW: O primeiro bloco de código não faz sentido desde que você está ingressando na tabela principal ( catalog_product_entity) .

MauroNigrele
fonte
"no Magento 1.7, eles fizeram uma otimização no sql selecionado que é usado para as opções de filtragem de preços. Eles removem a parte FROM sql (que é a entidade do produto - que contém o atributo type_id) e tornam a tabela relacionada price_index a principal - a única usado na parte FROM da consulta. Portanto, basicamente, a tabela na qual os dados são selecionados não é mais a tabela de entidade do produto (você perde todos os atributos da base de produtos); a tabela principal se torna o índice do produto. a equipe do Magento adicionou as versões 1.7 iniciais ". Consulte o seguinte
Magento Learner
1
wooow minha culpa pessoal, por algum motivo, eu estava pensando no método getCollection do bloco de back-end, portanto, nesse cenário, seu primeiro código está ok. Não tenho certeza se é a melhor solução, mas parece estar ok. Desculpe
MauroNigrele
@ MagentoLearner você tem certeza sobre esse post? Acabei de verificar novamente um EE1.14. Instalei e ainda uso catalog_product_entity como tabela principal, exceto quando você define o uso de catálogo simples (absolutamente recomendado), mas em ambos os casos você tem type_id presente no select. Você pode registrar a consulta como escrevi na resposta original?
MauroNigrele
1
mmmm interessante ... i Verifique também a consulta em um caso de pesquisa e esteja usando catalog_product_entity como tabela principal, talvez a "equipe magento" tenha decidido reverter essas alterações. Não consigo encontrar nenhum 1.7 instalado para verificá-lo, mas a ideia de alterar a tabela principal de uma entidade parece uma péssima decisão arquitetônica ... Bem, note que você acabou de arruinar o meu final de semana, agora preciso encontrar e instalar um CE1 .7 e procurar essa porcaria com meus próprios olhos ... minha esposa não vai ser feliz com este :)
MauroNigrele