Jump to content
  • 0

Problem - filtry nawigacyjne


jlo30

Question

Witam,

mam problem z filtrami nawigacyjnymi w module blocklayered.

Sklep działa jako multishop, a dany problem na razie dotyczy tylko sklepu głównego (w drugim sklepie nie ma jeszcze produktów).

Próbuje zrobić filtr koloru oraz rozmiaru. Produkty w sklepie posiadają takie atrybuty w ilości ok 200szt.

Jednak tworząc filtry oraz indeksując je w module blocklayered te atrybuty się nie indeksują. Zauważyłem, że gdy wybiorę opcję tworzenia filtrów dla Wszystkich kategorii to pojawia mi się filtr rozmiaru i koloru, natomiast jeśli wybiorę opcję tworzenia filtrów dla Specyficznych kategorii (mimo, ze wybiorę wszystkie kategorie), to już tych filtrów nie mam dostępnych. 

podejrzewam, że winna za to jest opcja generowania atrybutów. W tabeli "ps_layered_product_attribute" nie ma żadnego rekordu. Jak wpisze tam ręcznie rekord to pojawia się dany filtr atrybutu.

Opcja generowania atrybutów działa tak, że najpierw kasuje tabelę, a następnie buduję ją od początku. Kasowanie działa, ale już budowanie atrybutów nie. Dlaczego?

w pliku modules/blocklayered/blocklayered.php jest taka funkcja: 

 

/**
* 
* Generate data product attribute
*/
public function indexAttribute($id_product = null)
{
if (is_null($id_product))
Db::getInstance()->execute('TRUNCATE '._DB_PREFIX_.'layered_product_attribute');
else
Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'layered_product_attribute WHERE id_product = '.(int)$id_product);


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, product_attribute_shop.`id_shop`
FROM '._DB_PREFIX_.'product_attribute pa'.
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 , product_attribute_shop.`id_shop`');


return 1;


}

I myślę, że może z tym jest coś nie tak.

Chociaż mam inny testowy sklep Prestashop 1.5.6.1 multishop i tam filtry działają.

 

Może gdzieś powinienem mieć jakąś opcję zaznaczoną, której nie znalazłem?

 

Dziwne jest też to, że mimo ok. 200 atrybutów kolorów i 200 atrybutów rozmiarów - indeksacja trwa ok. 0,5 sekundy - nie za krótko?

 

 

Mam nadzieję, że coś mi poradzicie.

Może znacie jakiś zewnętrzny dobry moduł do filtrowania działający na multishop?

 

Prestashop 1.5.6.1

Link to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 0

Witam,

mam problem z filtrami nawigacyjnymi w module blocklayered.

Sklep działa jako multishop, a dany problem na razie dotyczy tylko sklepu głównego (w drugim sklepie nie ma jeszcze produktów).

Próbuje zrobić filtr koloru oraz rozmiaru. Produkty w sklepie posiadają takie atrybuty w ilości ok 200szt.

Jednak tworząc filtry oraz indeksując je w module blocklayered te atrybuty się nie indeksują. Zauważyłem, że gdy wybiorę opcję tworzenia filtrów dla Wszystkich kategorii to pojawia mi się filtr rozmiaru i koloru, natomiast jeśli wybiorę opcję tworzenia filtrów dla Specyficznych kategorii (mimo, ze wybiorę wszystkie kategorie), to już tych filtrów nie mam dostępnych. 

podejrzewam, że winna za to jest opcja generowania atrybutów. W tabeli "ps_layered_product_attribute" nie ma żadnego rekordu. Jak wpisze tam ręcznie rekord to pojawia się dany filtr atrybutu.

Opcja generowania atrybutów działa tak, że najpierw kasuje tabelę, a następnie buduję ją od początku. Kasowanie działa, ale już budowanie atrybutów nie. Dlaczego?

w pliku modules/blocklayered/blocklayered.php jest taka funkcja: 

 

/**
* 
* Generate data product attribute
*/
public function indexAttribute($id_product = null)
{
if (is_null($id_product))
Db::getInstance()->execute('TRUNCATE '._DB_PREFIX_.'layered_product_attribute');
else
Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'layered_product_attribute WHERE id_product = '.(int)$id_product);


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, product_attribute_shop.`id_shop`
FROM '._DB_PREFIX_.'product_attribute pa'.
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 , product_attribute_shop.`id_shop`');


return 1;


}

I myślę, że może z tym jest coś nie tak.

Chociaż mam inny testowy sklep Prestashop 1.5.6.1 multishop i tam filtry działają.

 

Może gdzieś powinienem mieć jakąś opcję zaznaczoną, której nie znalazłem?

 

Dziwne jest też to, że mimo ok. 200 atrybutów kolorów i 200 atrybutów rozmiarów - indeksacja trwa ok. 0,5 sekundy - nie za krótko?

 

 

Mam nadzieję, że coś mi poradzicie.

Może znacie jakiś zewnętrzny dobry moduł do filtrowania działający na multishop?

 

Prestashop 1.5.6.1

 

Może komuś się przyda. Powinno pomóc przynajmniej ze znikającymi atrybutami po odbudowaniu atrybutów.

Zamień:

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, product_attribute_shop.`id_shop`
FROM '._DB_PREFIX_.'product_attribute pa'.
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 , product_attribute_shop.`id_shop`'
);

na to:

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, pas.id_shop
            FROM '._DB_PREFIX_.'product_attribute pa
            INNER JOIN '._DB_PREFIX_.'product_attribute_shop pas ON pas.id_product_attribute = pa.id_product_attribute
            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, pas.id_shop'
            );
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...