Serial Posted September 28, 2015 Share Posted September 28, 2015 Hi, How can we exclude a category for blocknewproducts on PS 1.6 please ? 1 Link to comment Share on other sites More sharing options...
ventura Posted September 28, 2015 Share Posted September 28, 2015 Exclude a category in the module content, products ¿?, or hide the module in a determinated category? Link to comment Share on other sites More sharing options...
Serial Posted September 28, 2015 Author Share Posted September 28, 2015 No, in the module blocknewproducts, I want that it doesn't display a category of products. Link to comment Share on other sites More sharing options...
ventura Posted September 28, 2015 Share Posted September 28, 2015 (edited) In classes\Product.php override de function public static function getNewProducts Edit this part adding the red color code: $sql = 'SELECT COUNT(p.`id_product`) AS nb FROM `'._DB_PREFIX_.'product` p '.Shop::addSqlAssociation('product', 'p').' WHERE product_shop.`active` = 1 AND p.`id_category_default` != 11 ______________________ $sql->where('product_shop.`active` = 1 AND p.`id_category_default` != 11'); ________________________ 11 is the id category default products excluded Edited September 28, 2015 by ventura (see edit history) Link to comment Share on other sites More sharing options...
musicmaster Posted September 28, 2015 Share Posted September 28, 2015 You need to modify the function getNewProducts() in the file \classes\product.php. Near the sentence "$sql->where('product_shop.`active` = 1');" you need to add your own condition: $sql->where('product_shop.`id_category_default` != 123'); /* fill in your own number */ Link to comment Share on other sites More sharing options...
Serial Posted September 28, 2015 Author Share Posted September 28, 2015 (edited) It's the same. Products are always visible in the homepage. if ($count) { $sql = 'SELECT COUNT(p.`id_product`) AS nb FROM `'._DB_PREFIX_.'product` p '.Shop::addSqlAssociation('product', 'p').' WHERE product_shop.`active` = 1 AND p.`id_category_default` != 100 AND product_shop.`date_add` > "'.date('Y-m-d', strtotime('-'.(Configuration::get('PS_NB_DAYS_NEW_PRODUCT') ? (int)Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY')).'" '.($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '').' '.$sql_groups; return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql); } $sql->where('product_shop.`active` = 1 AND p.`id_category_default` != 100'); Edited September 28, 2015 by Serial (see edit history) Link to comment Share on other sites More sharing options...
musicmaster Posted September 28, 2015 Share Posted September 28, 2015 (edited) In the function getNewProducts() you have several queries. In one it counts how many new products there are. In another it actually retrieves them. You modified the count. Edited September 28, 2015 by musicmaster (see edit history) Link to comment Share on other sites More sharing options...
Serial Posted September 28, 2015 Author Share Posted September 28, 2015 Where is the query where it retrieves them ? Link to comment Share on other sites More sharing options...
musicmaster Posted September 28, 2015 Share Posted September 28, 2015 It is the one that is spread out over many lines: $sql = new DbQuery(); $sql->select( 'p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity, pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, pl.`available_now`, pl.`available_later`, MAX(image_shop.`id_image`) id_image, il.`legend`, m.`name` AS manufacturer_name, product_shop.`date_add` > "'.date('Y-m-d', strtotime('-'.(Configuration::get('PS_NB_DAYS_NEW_PRODUCT') ? (int)Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY')).'" as new'.(Combination::isFeatureActive() ? ', MAX(product_attribute_shop.minimal_quantity) AS product_attribute_minimal_quantity' : '') ); $sql->from('product', 'p'); $sql->join(Shop::addSqlAssociation('product', 'p')); $sql->leftJoin('product_lang', 'pl', ' p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl') ); $sql->leftJoin('image', 'i', 'i.`id_product` = p.`id_product`'); $sql->join(Shop::addSqlAssociation('image', 'i', false, 'image_shop.cover=1')); $sql->leftJoin('image_lang', 'il', 'i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang); $sql->leftJoin('manufacturer', 'm', 'm.`id_manufacturer` = p.`id_manufacturer`'); $sql->where('product_shop.`active` = 1'); if ($front) $sql->where('product_shop.`visibility` IN ("both", "catalog")'); $sql->where('product_shop.`date_add` > "'.date('Y-m-d', strtotime('-'.(Configuration::get('PS_NB_DAYS_NEW_PRODUCT') ? (int)Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY')).'"'); if (Group::isFeatureActive()) { $sql->join('JOIN '._DB_PREFIX_.'category_product cp ON (cp.id_product = p.id_product)'); $sql->join('JOIN '._DB_PREFIX_.'category_group cg ON (cg.id_category = cp.id_category)'); $sql->where('cg.`id_group` '.(count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1')); } $sql->groupBy('product_shop.id_product'); $sql->orderBy((isset($order_by_prefix) ? pSQL($order_by_prefix).'.' : '').'`'.pSQL($order_by).'` '.pSQL($order_way)); $sql->limit($nb_products, $page_number * $nb_products); Previously I wrote which line you need to add among the where clauses. Link to comment Share on other sites More sharing options...
Serial Posted September 28, 2015 Author Share Posted September 28, 2015 (edited) I don't see where it is. That's the getNewProducts() function with my modifications (line 2178 and 2202) : public static function getNewProducts($id_lang, $page_number = 0, $nb_products = 10, $count = false, $order_by = null, $order_way = null, Context $context = null) { if (!$context) $context = Context::getContext(); $front = true; if (!in_array($context->controller->controller_type, array('front', 'modulefront'))) $front = false; if ($page_number < 0) $page_number = 0; if ($nb_products < 1) $nb_products = 10; if (empty($order_by) || $order_by == 'position') $order_by = 'date_add'; if (empty($order_way)) $order_way = 'DESC'; 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'; if (!Validate::isOrderBy($order_by) || !Validate::isOrderWay($order_way)) die(Tools::displayError()); $sql_groups = ''; if (Group::isFeatureActive()) { $groups = FrontController::getCurrentCustomerGroups(); $sql_groups = ' AND EXISTS(SELECT 1 FROM `'._DB_PREFIX_.'category_product` cp JOIN `'._DB_PREFIX_.'category_group` cg ON (cp.id_category = cg.id_category AND cg.`id_group` '.(count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1').') WHERE cp.`id_product` = p.`id_product`)'; } if (strpos($order_by, '.') > 0) { $order_by = explode('.', $order_by); $order_by_prefix = $order_by[0]; $order_by = $order_by[1]; } if ($count) { $sql = 'SELECT COUNT(p.`id_product`) AS nb FROM `'._DB_PREFIX_.'product` p '.Shop::addSqlAssociation('product', 'p').' WHERE product_shop.`active` = 1 AND p.`id_category_default` != 100 AND product_shop.`date_add` > "'.date('Y-m-d', strtotime('-'.(Configuration::get('PS_NB_DAYS_NEW_PRODUCT') ? (int)Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY')).'" '.($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '').' '.$sql_groups; return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql); } $sql = new DbQuery(); $sql->select( 'p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity, pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, pl.`available_now`, pl.`available_later`, image_shop.`id_image` id_image, il.`legend`, m.`name` AS manufacturer_name, product_shop.`date_add` > "'.date('Y-m-d', strtotime('-'.(Configuration::get('PS_NB_DAYS_NEW_PRODUCT') ? (int)Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY')).'" as new' ); $sql->from('product', 'p'); $sql->join(Shop::addSqlAssociation('product', 'p')); $sql->leftJoin('product_lang', 'pl', ' p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl') ); $sql->leftJoin('image_shop', 'image_shop', 'image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop='.(int)$context->shop->id); $sql->leftJoin('image_lang', 'il', 'image_shop.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang); $sql->leftJoin('manufacturer', 'm', 'm.`id_manufacturer` = p.`id_manufacturer`'); $sql->where('product_shop.`active` = 1 AND p.`id_category_default` != 100'); if ($front) $sql->where('product_shop.`visibility` IN ("both", "catalog")'); $sql->where('product_shop.`date_add` > "'.date('Y-m-d', strtotime('-'.(Configuration::get('PS_NB_DAYS_NEW_PRODUCT') ? (int)Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY')).'"'); if (Group::isFeatureActive()) { $sql->join('JOIN '._DB_PREFIX_.'category_product cp ON (cp.id_product = p.id_product)'); $sql->join('JOIN '._DB_PREFIX_.'category_group cg ON (cg.id_category = cp.id_category)'); $sql->where('cg.`id_group` '.(count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1')); } $sql->groupBy('product_shop.id_product'); $sql->orderBy((isset($order_by_prefix) ? pSQL($order_by_prefix).'.' : '').'`'.pSQL($order_by).'` '.pSQL($order_way)); $sql->limit($nb_products, $page_number * $nb_products); if (Combination::isFeatureActive()) { $sql->select('product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity, IFNULL(product_attribute_shop.id_product_attribute,0) id_product_attribute'); $sql->leftJoin('product_attribute_shop', 'product_attribute_shop', 'p.`id_product` = product_attribute_shop.`id_product` AND product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop='.(int)$context->shop->id); } $sql->join(Product::sqlStock('p', 0)); $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); if ($order_by == 'price') Tools::orderbyPrice($result, $order_way); if (!$result) return false; $products_ids = array(); foreach ($result as $row) $products_ids[] = $row['id_product']; // Thus you can avoid one query per product, because there will be only one query for all the products of the cart Product::cacheFrontFeatures($products_ids, $id_lang); return Product::getProductsProperties((int)$id_lang, $result); } Edited September 28, 2015 by Serial (see edit history) Link to comment Share on other sites More sharing options...
musicmaster Posted September 28, 2015 Share Posted September 28, 2015 I haven't studied this $sql->where function. What you do might work. If it doesn't work you should consider doing what they do in the Prestashop code: not using "AND" and instead using more than one "$sql->where". Link to comment Share on other sites More sharing options...
Serial Posted September 28, 2015 Author Share Posted September 28, 2015 Not work too. $sql->where('product_shop.`active` = 1'); $sql->where('p.`id_category_default` != 100'); I have always my products belong to category 100 in homepage. Link to comment Share on other sites More sharing options...
ventura Posted September 28, 2015 Share Posted September 28, 2015 Try in this way, added the product_shop, both are in the same table. Not bad mysql practice I think so $sql->where('product_shop.`active` = 1 AND product_shop.`id_category_default` != 11'); However the musicmaster comment it´s a good point 1 Link to comment Share on other sites More sharing options...
Serial Posted September 28, 2015 Author Share Posted September 28, 2015 (edited) Try in this way, added the product_shop, both are in the same table. Not bad mysql practice I think so $sql->where('product_shop.`active` = 1 AND product_shop.`id_category_default` != 11'); However the musicmaster comment it´s a good point Not work :/ EDIT : That's OK ! Thanks a lot Edited September 28, 2015 by Serial (see edit history) Link to comment Share on other sites More sharing options...
myselfidem Posted September 28, 2015 Share Posted September 28, 2015 Many thanks for this tip ! Used Inside : override\classes for Product.php for ID= 216 (Promo !) and works fine ! $sql->where('product_shop.`active` = 1 AND product_shop.`id_category_default` != 216'); Friendly 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