[PRESTASHOP] Blocklayered e atributos fora de stock
Olá,
Apesar de meio desaparecido, continuo a trabalhar arduamente em lojas PrestaShop e hoje, venho partilhar um problema que afeta muitos utilizadores e que a equipa do PrestaShop teima em não resolver. São inúmeros os bugs abertos relativos ao módulo blocklayered.
Se, como eu, as vossas lojas utilizam produtos baseados em tamanhos, o block layered apresenta o filtro por tamanho, no entanto, independentemente do que escolherem, aparecem mesmo os que tiverem o tamanho com quantidade 0, o que não faz sentido absolutamente nenhum.
A única forma de contornar a situação é colocar como desabilitado o tamanho em questão quando a quantidade é 0, o que na prática, não é muito cómodo…
Na minha versão 1.5.4 do PrestaShop, com o block layered versão 1.8.9 tive exatamente o mesmo problema e a solução, pelo menos para mim, não passa por desabilitar o tamanho cada vez que sai de stock, se não, não faria outra coisa…
Então, agarrei-me ao php e editei o ficheiro blocklayered.php para que os filtros ficassem corretos em relação ao tamanho. Para os interessados, aqui o MOD.
1 – Não Apresentar Produtos Com o Attributo Escolhido Fora de Stock
Abram o ficheiro blocklayered.php e por volta da linha 2375 encontram: case ‘idproductattribute’ : logo abaixo, tem 2 foreach, no segundo o código é:
[syntax type=”php”]
foreach ($sub_queries as $sub_query)
{
$query_filters_where .= ‘ AND p.id_product IN (SELECT pa.`id_product`
FROM `’._DB_PREFIX_.’product_attribute_combination` pac
LEFT JOIN `’._DB_PREFIX_.’product_attribute` pa
ON (pa.`id_product_attribute` = pac.`id_product_attribute`)’;
if (version_compare(_PS_VERSION_,’1.5′,’>’))
$query_filters_where .= Shop::addSqlAssociation(‘product_attribute’, ‘pa’);
$query_filters_where .= ‘WHERE ‘.implode(‘ OR ‘, $sub_query).’) ‘;
}[/syntax]
substituam o código acima por:
[syntax type=”php”]
foreach ($sub_queries as $sub_query)
{
$query_filters_where .= ‘ AND p.id_product IN (SELECT pa.`id_product`
FROM `’._DB_PREFIX_.’product_attribute_combination` pac
LEFT JOIN `’._DB_PREFIX_.’product_attribute` pa
ON (pa.`id_product_attribute` = pac.`id_product_attribute`)’;
if (version_compare(_PS_VERSION_,’1.5′,’>’))
$query_filters_where .= ‘INNER JOIN `’._DB_PREFIX_.’stock_available` sa
ON (sa.`id_product_attribute` = pac.`id_product_attribute` AND sa.`quantity` > 0)’;
if (version_compare(_PS_VERSION_,’1.5′,’>’))
$query_filters_where .= Shop::addSqlAssociation(‘product_attribute’, ‘pa’);
$query_filters_where .= ‘WHERE ‘.implode(‘ OR ‘, $sub_query).’) ‘;
}
[/syntax]
Agora, se forem a uma categoria e filtrarem um tamanho, se o produto não tiver quantidades nesse tamanho ele não vai aparecer.
Agora, que está resolvido, aparece outro problema. Nos filtros do tamanho, continuam a aparecer todos os produtos com aquele tamanho, a conta não está certa. Para alterar isso, passo 2.
2 – Correção do Número de Produtos Com o Attributo Fora de Stock
Ora, é chato se, ao lado do tamanho nos filtros aparecerem 20 produtos com o tamanho 40 e na listagem aparecerem apenas 19…
Vamos corrigir! No mesmo ficheiro (blocklayered.php) por volta da linha 255 aparece public function indexAttribute($id_product = null), logo a seguir aparece o código:
[syntax type=”php”]
Db::getInstance()->execute(‘INSERT INTO `’._DB_PREFIX_.’layered_product_attribute` (`id_attribute`, `id_product`, `id_attribute_group`, `id_shop`)
SELECT pac.id_attribute, pa.id_product, ag.id_attribute_group, ‘.(version_compare(_PS_VERSION_,’1.5′,’>’) ? ‘product_attribute_shop.`id_shop`’ : ‘1’).’
FROM ‘._DB_PREFIX_.’product_attribute pa
‘.(version_compare(_PS_VERSION_,’1.5′,’>’) ? Shop::addSqlAssociation(‘product_attribute’, ‘pa’) : ”).’
INNER JOIN ‘._DB_PREFIX_.’product_attribute_combination pac ON pac.id_product_attribute = pa.id_product_attribute
INNER JOIN ‘._DB_PREFIX_.’attribute a ON (a.id_attribute = pac.id_attribute)
INNER JOIN ‘._DB_PREFIX_.’attribute_group ag ON ag.id_attribute_group = a.id_attribute_group
‘.(is_null($id_product) ? ” : ‘AND pa.id_product = ‘.(int)$id_product).’
GROUP BY a.id_attribute, pa.id_product ‘.(version_compare(_PS_VERSION_,’1.5′,’>’) ? ‘, product_attribute_shop.`id_shop`’ : ”));
[/syntax]
substituam por:
[syntax type=”php”]
Db::getInstance()->execute(‘INSERT INTO `’._DB_PREFIX_.’layered_product_attribute` (`id_attribute`, `id_product`, `id_attribute_group`, `id_shop`)
SELECT pac.id_attribute, pa.id_product, ag.id_attribute_group, ‘.(version_compare(_PS_VERSION_,’1.5′,’>’) ? ‘product_attribute_shop.`id_shop`’ : ‘1’).’
FROM ‘._DB_PREFIX_.’product_attribute pa
‘.(version_compare(_PS_VERSION_,’1.5′,’>’) ? Shop::addSqlAssociation(‘product_attribute’, ‘pa’) : ”).’
INNER JOIN ‘._DB_PREFIX_.’product_attribute_combination pac ON pac.id_product_attribute = pa.id_product_attribute
‘.(version_compare(_PS_VERSION_,’1.5′,’>’) ? ‘
INNER JOIN ‘._DB_PREFIX_.’stock_available sa ON (sa.id_product_attribute = pac.id_product_attribute AND sa.quantity > 0)
‘ : ”).’
INNER JOIN ‘._DB_PREFIX_.’attribute a ON (a.id_attribute = pac.id_attribute)
INNER JOIN ‘._DB_PREFIX_.’attribute_group ag ON ag.id_attribute_group = a.id_attribute_group
‘.(is_null($id_product) ? ” : ‘AND pa.id_product = ‘.(int)$id_product).’
GROUP BY a.id_attribute, pa.id_product ‘.(version_compare(_PS_VERSION_,’1.5′,’>’) ? ‘, product_attribute_shop.`id_shop`’ : ”));
[/syntax]
OK. Concluído. Editem o ficheiro e enviem de novo para o servidor, não se esqueçam do backup.
Agora, na vossa área de administração, vão ao módulo Layered Navigation. Click em: Build Attribute Index
Vão à página de categoria onde havia o problema e faça um refresh, vai estar corrigido…
Abraços
[PRESTASHOP] Erro HTTPS na versão 1.5.5.0 :: Izak.pt :: • 9 anos ago
[…] o meu último post sobre o módulo blocklayered, fiz a atualização do PrestaShop da versão 1.5.4 para 1.5.5.0. Nesta atualização deparei-me […]
reply