From 42270991c537f13d4483873b5a20c386b56578c8 Mon Sep 17 00:00:00 2001 From: Etienne Roudeix Date: Tue, 20 Aug 2013 11:29:35 +0200 Subject: [PATCH] product loop parameters done --- .../lib/Thelia/Core/Template/Loop/Product.php | 96 ++++++++++--------- templates/default/debug.html | 10 +- 2 files changed, 58 insertions(+), 48 deletions(-) diff --git a/core/lib/Thelia/Core/Template/Loop/Product.php b/core/lib/Thelia/Core/Template/Loop/Product.php index aca4139aa..8b0bd72fe 100755 --- a/core/lib/Thelia/Core/Template/Loop/Product.php +++ b/core/lib/Thelia/Core/Template/Loop/Product.php @@ -35,6 +35,8 @@ use Thelia\Log\Tlog; use Thelia\Model\CategoryQuery; use Thelia\Model\Map\FeatureProductTableMap; +use Thelia\Model\Map\ProductPriceTableMap; +use Thelia\Model\Map\ProductSaleElementsTableMap; use Thelia\Model\Map\ProductTableMap; use Thelia\Model\ProductCategoryQuery; use Thelia\Model\ProductQuery; @@ -101,7 +103,7 @@ class Product extends BaseLoop ) ), /* - * promo, new, quantity and weight may differ depending on the different attributes + * promo, new, quantity, weight or price may differ depending on the different attributes * by default, product loop will look for at least 1 attribute which matches all the loop criteria : attribute_non_strict_match="none" * you can also provide a list of non-strict attributes. * ie : attribute_non_strict_match="promo,new" @@ -129,8 +131,6 @@ class Product extends BaseLoop { $search = ProductQuery::create(); - //$search->withColumn('CASE WHEN ' . ProductTableMap::PROMO . '=1 THEN ' . ProductTableMap::PRICE2 . ' ELSE ' . ProductTableMap::PRICE . ' END', 'real_price'); - /** * Criteria::INNER_JOIN in second parameter for joinWithI18n exclude query without translation. * @@ -181,12 +181,12 @@ class Product extends BaseLoop if ($new === true) { $usedAttributeNonStrictMatchList[] = 'new'; $search->joinProductSaleElements('is_new', Criteria::LEFT_JOIN) - ->addJoinCondition('is_new', '`is_new`.NEWNESS = 1') + ->where('`is_new`.NEWNESS' . Criteria::EQUAL . '1') ->where('NOT ISNULL(`is_new`.ID)'); } else if($new === false) { $usedAttributeNonStrictMatchList[] = 'new'; $search->joinProductSaleElements('is_new', Criteria::LEFT_JOIN) - ->addJoinCondition('is_new', '`is_new`.NEWNESS = 0') + ->where('`is_new`.NEWNESS' . Criteria::EQUAL . '0') ->where('NOT ISNULL(`is_new`.ID)'); } @@ -195,12 +195,12 @@ class Product extends BaseLoop if ($promo === true) { $usedAttributeNonStrictMatchList[] = 'promo'; $search->joinProductSaleElements('is_promo', Criteria::LEFT_JOIN) - ->addJoinCondition('is_promo', "`is_promo`.PROMO = 1") + ->where('`is_promo`.PROMO' . Criteria::EQUAL . '1') ->where('NOT ISNULL(`is_promo`.ID)'); } else if($promo === false) { $usedAttributeNonStrictMatchList[] = 'promo'; $search->joinProductSaleElements('is_promo', Criteria::LEFT_JOIN) - ->addJoinCondition('is_promo', "`is_promo`.PROMO = 0") + ->where('`is_promo`.PROMO' . Criteria::EQUAL . '0') ->where('NOT ISNULL(`is_promo`.ID)'); } @@ -209,7 +209,7 @@ class Product extends BaseLoop if (null != $min_stock) { $usedAttributeNonStrictMatchList[] = 'min_stock'; $search->joinProductSaleElements('is_min_stock', Criteria::LEFT_JOIN) - ->addJoinCondition('is_min_stock', "`is_min_stock`.QUANTITY > ?", $min_stock, null, \PDO::PARAM_INT) + ->where('`is_min_stock`.QUANTITY' . Criteria::GREATER_THAN . '?', $min_stock, \PDO::PARAM_INT) ->where('NOT ISNULL(`is_min_stock`.ID)'); } @@ -218,7 +218,7 @@ class Product extends BaseLoop if (null != $min_weight) { $usedAttributeNonStrictMatchList[] = 'min_weight'; $search->joinProductSaleElements('is_min_weight', Criteria::LEFT_JOIN) - ->addJoinCondition('is_min_weight', "`is_min_weight`.WEIGHT > ?", $min_weight, null, \PDO::PARAM_INT) + ->where('`is_min_weight`.WEIGHT' . Criteria::GREATER_THAN . '?', $min_weight, \PDO::PARAM_STR) ->where('NOT ISNULL(`is_min_weight`.ID)'); } @@ -227,17 +227,55 @@ class Product extends BaseLoop if (null != $max_weight) { $usedAttributeNonStrictMatchList[] = 'max_weight'; $search->joinProductSaleElements('is_max_weight', Criteria::LEFT_JOIN) - ->addJoinCondition('is_max_weight', "`is_max_weight`.WEIGHT < ?", $max_weight, null, \PDO::PARAM_INT) + ->where('`is_max_weight`.WEIGHT' . Criteria::LESS_THAN . '?', $max_weight, \PDO::PARAM_STR) ->where('NOT ISNULL(`is_max_weight`.ID)'); } + $min_price = $this->getMin_price(); + + if(null !== $min_price) { + + $minPriceJoin = new Join(); + $minPriceJoin->addExplicitCondition(ProductSaleElementsTableMap::TABLE_NAME, 'ID', 'min_price_pse', ProductPriceTableMap::TABLE_NAME, 'PRODUCT_SALE_ELEMENTS_ID', 'is_min_price'); + $minPriceJoin->setJoinType(Criteria::LEFT_JOIN); + + $search->joinProductSaleElements('min_price_pse', Criteria::LEFT_JOIN) + ->addJoinObject($minPriceJoin) + ->condition('in_promo', '`min_price_pse`.promo'. Criteria::EQUAL .'1') + ->condition('not_in_promo', '`min_price_pse`.promo'. Criteria::NOT_EQUAL .'1') + ->condition('min_promo_price', '`is_min_price`.promo_price' . Criteria::GREATER_EQUAL . '?', $min_price, \PDO::PARAM_STR) + ->condition('min_price', '`is_min_price`.price' . Criteria::GREATER_EQUAL . '?', $min_price, \PDO::PARAM_STR) + ->combine(array('in_promo', 'min_promo_price'), Criteria::LOGICAL_AND, 'in_promo_min_price') + ->combine(array('not_in_promo', 'min_price'), Criteria::LOGICAL_AND, 'not_in_promo_min_price') + ->where(array('not_in_promo_min_price', 'in_promo_min_price'), Criteria::LOGICAL_OR); + } + + $max_price = $this->getMax_price(); + + if(null !== $max_price) { + + $minPriceJoin = new Join(); + $minPriceJoin->addExplicitCondition(ProductSaleElementsTableMap::TABLE_NAME, 'ID', 'max_price_pse', ProductPriceTableMap::TABLE_NAME, 'PRODUCT_SALE_ELEMENTS_ID', 'is_max_price'); + $minPriceJoin->setJoinType(Criteria::LEFT_JOIN); + + $search->joinProductSaleElements('max_price_pse', Criteria::LEFT_JOIN) + ->addJoinObject($minPriceJoin) + ->condition('in_promo', '`max_price_pse`.promo'. Criteria::EQUAL .'1') + ->condition('not_in_promo', '`max_price_pse`.promo'. Criteria::NOT_EQUAL .'1') + ->condition('min_promo_price', '`is_max_price`.promo_price' . Criteria::LESS_EQUAL . '?', $max_price, \PDO::PARAM_STR) + ->condition('max_price', '`is_max_price`.price' . Criteria::LESS_EQUAL . '?', $max_price, \PDO::PARAM_STR) + ->combine(array('in_promo', 'min_promo_price'), Criteria::LOGICAL_AND, 'in_promo_max_price') + ->combine(array('not_in_promo', 'max_price'), Criteria::LOGICAL_AND, 'not_in_promo_max_price') + ->where(array('not_in_promo_max_price', 'in_promo_max_price'), Criteria::LOGICAL_OR); + } + if( $attributeNonStrictMatch != '*' ) { if($attributeNonStrictMatch == 'none') { $actuallyUsedAttributeNonStrictMatchList = $usedAttributeNonStrictMatchList; } else { $actuallyUsedAttributeNonStrictMatchList = array_values(array_intersect($usedAttributeNonStrictMatchList, $attributeNonStrictMatch)); } - + foreach($actuallyUsedAttributeNonStrictMatchList as $key => $actuallyUsedAttributeNonStrictMatch) { if($key == 0) continue; @@ -245,42 +283,6 @@ class Product extends BaseLoop } } - //$min_price = $this->getMin_price(); - - //if(null !== $min_price) { - /** - * Following should work but does not : - * - * $search->filterBy('real_price', $max_price, Criteria::GREATER_EQUAL); - */ - /*$search->condition('in_promo', ProductTableMap::PROMO . Criteria::EQUAL . '1') - ->condition('not_in_promo', ProductTableMap::PROMO . Criteria::NOT_EQUAL . '1') - ->condition('min_price2', ProductTableMap::PRICE2 . Criteria::GREATER_EQUAL . '?', $min_price) - ->condition('min_price', ProductTableMap::PRICE . Criteria::GREATER_EQUAL . '?', $min_price) - ->combine(array('in_promo', 'min_price2'), Criteria::LOGICAL_AND, 'in_promo_min_price') - ->combine(array('not_in_promo', 'min_price'), Criteria::LOGICAL_AND, 'not_in_promo_min_price') - ->where(array('not_in_promo_min_price', 'in_promo_min_price'), Criteria::LOGICAL_OR); - } - - $max_price = $this->getMax_price();*/ - - //if(null !== $max_price) { - /** - * Following should work but does not : - * - * $search->filterBy('real_price', $max_price, Criteria::LESS_EQUAL); - */ - /*$search->condition('in_promo', ProductTableMap::PROMO . Criteria::EQUAL . '1') - ->condition('not_in_promo', ProductTableMap::PROMO . Criteria::NOT_EQUAL . '1') - ->condition('max_price2', ProductTableMap::PRICE2 . Criteria::LESS_EQUAL . '?', $max_price) - ->condition('max_price', ProductTableMap::PRICE . Criteria::LESS_EQUAL . '?', $max_price) - ->combine(array('in_promo', 'max_price2'), Criteria::LOGICAL_AND, 'in_promo_max_price') - ->combine(array('not_in_promo', 'max_price'), Criteria::LOGICAL_AND, 'not_in_promo_max_price') - ->where(array('not_in_promo_max_price', 'in_promo_max_price'), Criteria::LOGICAL_OR); - }*/ - - /**/ - $current = $this->getCurrent(); if ($current === true) { diff --git a/templates/default/debug.html b/templates/default/debug.html index 19dea8c59..cc445f992 100644 --- a/templates/default/debug.html +++ b/templates/default/debug.html @@ -4,4 +4,12 @@ {*loop name="product" type="product" min_weight="1000" max_weight="6000" attribute_non_strict_match="*"}

PRODUCT : #REF / #TITLE (#ID)

-{/loop*} \ No newline at end of file +{/loop*} + +{*loop name="product" type="product" min_price="100" max_price="300" min_stock="4" min_weight="6000" max_weight="7000" attribute_non_strict_match="*" promo="on"} +

PRODUCT : #REF / #TITLE (#ID)

+{/loop*} + +{loop name="product" type="product" order="promo,min_price"} +

PRODUCT : #REF / #TITLE (#ID)

+{/loop} \ No newline at end of file