Bardzo mnie denerwował brak wyszukiwarki opartej na atrybutach, więc sobie zacząłem robić własną. Jest jeszcze nieco niedopracowana, bo nie znam się na szablonach smarty, php znam odlegle a i framework prestashop jest mi obcy, ale coś tam udało mi się stworzyć.
Uwaga - ten moduł wyszukuje po
jednym atrybucie, choć wyświetla do wyboru wszystkie grupy atrybutów. Dopiero planuję zrobić wyszukiwanie po wielu atrybutach.
Teraz konkretnie:
~ Moduł jest obecnie przypinany tylko do lewej kolumny.
~ Moduł publikuję za zasadzie Open-Source, więc pomóżcie mi go rozwijać, jesli chcecie i potraficie.
~ Moduł do poprawnego działania wymaga modyfikacji plików Prestashopu LUB przekopiowania gotowych plików ode mnie (są to zmodyfikowane pliki z PrestaShop PL BETA rewizja 118). Opis niżej.
~ Moduł jest napisany na szybko i dlatego warstwa prezentacji nie jest rozdzielona od warstwy kodu. Przykro mi, ale nie znam na tyle smarty, aby dać sobię radę z pewnymi rzeczami. Liczę na pomoc.
~ Moduł obecnie obsługuje dwa języki: angielski i polski.
~ Znany mi bug: przy wyświetlaniu wyników content ma tytuł Szukaj 'Array'. Popracuję nad tym w wolnej chwili - trzeba zmienić w szablonie, w pliku 'search.tpl', aby poprawnie obsługiwał zmienną 'id_attribute'.
Screenshot:
A teraz odnośnie niezbędnych modyfikacji w plikach. Nie znam frameworku PrestaShop i zrobiłem to tak, że zmodyfikowałem plik "search.php" w folderze głównym oraz "/classes/Search.php". Zmiany są następujące:
W "search.php" należy nad komentarzem /* Tags */ dodać następujący kod:
/* Attribute IDs */
elseif ($attribute_id = Tools::getValue('attribute_id'))
{
$search = new Search();
$nbProducts = intval($search->attribute_id(intval($cookie->id_lang), $attribute_id, true));
include(dirname(__FILE__).'/pagination.php');
$smarty->assign(array(
'attribute_id' => $attribute_id,
'products' => $search->attribute_id(intval($cookie->id_lang), $attribute_id, false, $p, $n),
'nbProducts' => $nbProducts));
}
W "/classes/Search.php" trzeba zaś dodać nową funkcję do klasy:
/**
* @param integer $id_lang Language id for results
* @param string $attribute_id Attribute ID to find
* @param boolean $count Only to get number of results (optional)
* @param string $pageNumber Current page (optional)
* @param string $pageSize Results per page (optional)
* @return array Attribute ID search results
*/
public function attribute_id($id_lang, $attribute_id, $count = false, $pageNumber = 0, $pageSize = 10)
{
global $link;
if (!is_numeric($pageNumber) OR !is_numeric($pageSize)
OR !Validate::isBool($count) OR !Validate::isValidSearch($tag))
die(Tools::displayError());
if ($pageNumber < 0) $pageNumber = 0;
if ($pageSize < 1) $pageSize = 10;
/* Only if we need total results number */
if ($count)
{
$result = Db::getInstance()->getRow('
SELECT
COUNT(DISTINCT p.`id_product`) AS nb
FROM
`'._DB_PREFIX_.'product` AS p,
`'._DB_PREFIX_.'product_attribute` AS ppa,
`'._DB_PREFIX_.'product_attribute_combination` AS ppac
WHERE
ppac.`id_attribute` = '.$attribute_id.' AND
ppa.`id_product_attribute` = ppac.`id_product_attribute` AND
p.`id_product` = ppa.`id_product` AND
p.`active` = 1');
return isset($result['nb']) ? $result['nb'] : 0;
}
$result = Db::getInstance()->ExecuteS('
SELECT
p.*,
pl.`description_short`,
pl.`link_rewrite`,
pl.`name`,
tax.`rate`,
i.`id_image`,
il.`legend`
FROM
`'._DB_PREFIX_.'product` AS p,
`'._DB_PREFIX_.'product_attribute` AS ppa,
`'._DB_PREFIX_.'product_attribute_combination` AS ppac,
`'._DB_PREFIX_.'product_lang` AS pl,
`'._DB_PREFIX_.'image` AS i,
`'._DB_PREFIX_.'image_lang` AS il,
`'._DB_PREFIX_.'tax` as tax
WHERE
ppac.`id_attribute` = '.$attribute_id.' AND
ppa.`id_product_attribute` = ppac.`id_product_attribute` AND
p.`id_product` = ppa.`id_product` AND
p.`id_product` = pl.`id_product` AND
pl.`id_lang` = '.intval($id_lang).' AND
i.`id_product` = p.`id_product` AND
i.`cover` = 1 AND
p.`id_tax` = tax.`id_tax` AND
p.`active` = 1
GROUP BY
p.`id_product`');
if (!$result) return false;
return Product::getProductsProperties($id_lang, $result);
}
Po tych zmianach wywołanie takiego linku
http://mojsklep.pl/search.php?id_atrybutu=13 da w wyniku wypis wszystkich produktów zawierających atrybut o ID 13.
Swoją drogą, można łatwo dostosować powyższy kod do wyszukiwania nie po id atrybutu ale bo jego nazwie.
Przetestujcie moduł - u mnie działa wyśmienicie.W załączeniu do tego posta jest właśnie paczka z modułem oraz ze zmodyfikowanymi plikami do PrestaShop PL BETA rewizja 118 i instrukcja po angielsku.