cedric_charles Posted April 1, 2016 Share Posted April 1, 2016 Hello ! By default, Prestashop let us list our products by category and filter them with features, but still based on a category. I would like to have page that will list all product based on a feature only (for example all product that are available in the "blue" color). Is that possible ? Thank you in advance ! Link to comment Share on other sites More sharing options...
globosoftware.net Posted April 2, 2016 Share Posted April 2, 2016 My solution that you can code a function like getProducts() . You can found the function in classes/Product.php You need add sql query to get product based feature id. public static function getProductsByFeatureValue($id_lang, $start, $limit, $order_by, $order_way, $id_feature_value, $id_category = false, $only_active = false, Context $context = null) { if (!$context) $context = Context::getContext(); $front = true; if (!in_array($context->controller->controller_type, array('front', 'modulefront'))) $front = false; if (!Validate::isOrderBy($order_by) || !Validate::isOrderWay($order_way)) die (Tools::displayError()); if ($order_by == 'id_product' || $order_by == 'price' || $order_by == 'date_add' || $order_by == 'date_upd') $order_by_prefix = 'p'; elseif ($order_by == 'name') $order_by_prefix = 'pl'; elseif ($order_by == 'position') $order_by_prefix = 'c'; if (strpos($order_by, '.') > 0) { $order_by = explode('.', $order_by); $order_by_prefix = $order_by[0]; $order_by = $order_by[1]; } $sql = 'SELECT p.*, product_shop.*, pl.* , m.`name` AS manufacturer_name, s.`name` AS supplier_name FROM `'._DB_PREFIX_.'product` p '.Shop::addSqlAssociation('product', 'p').' LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` '.Shop::addSqlRestrictionOnLang('pl').') LEFT JOIN `'._DB_PREFIX_.'feature_product` fp ON (p.`id_product` = fp.`id_product`) LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`) LEFT JOIN `'._DB_PREFIX_.'supplier` s ON (s.`id_supplier` = p.`id_supplier`)'. ($id_category ? 'LEFT JOIN `'._DB_PREFIX_.'category_product` c ON (c.`id_product` = p.`id_product`)' : '').' WHERE pl.`id_lang` = '.(int)$id_lang. ($id_category ? ' AND c.`id_category` = '.(int)$id_category : ''). ($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : ''). ($only_active ? ' AND product_shop.`active` = 1' : '').' AND fp.`id_feature_value` ='.$id_feature_value.' ORDER BY '.(isset($order_by_prefix) ? pSQL($order_by_prefix).'.' : '').'`'.pSQL($order_by).'` '.pSQL($order_way). ($limit > 0 ? ' LIMIT '.(int)$start.','.(int)$limit : ''); $rq = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); if ($order_by == 'price') Tools::orderbyPrice($rq, $order_way); foreach ($rq as &$row) $row = Product::getTaxesInformations($row); return ($rq); } You can see I added $id_feature_value public static function getProducts($id_lang, $start, $limit, $order_by, $order_way, $id_feature_value, $id_category = false, $only_active = false, Context $context = null) I also added the lines LEFT JOIN `'._DB_PREFIX_.'feature_product` fp ON (p.`id_product` = fp.`id_product`) AND fp.`id_feature_value` ='.$id_feature_value.' Note: This is just quick help. I can't have time to test. I just give you PHP function to get all products by feature value. You should learn more "How to create a new prestashop page" Or "How to override PS class" Good luck! Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now