product loop parameters done

This commit is contained in:
Etienne Roudeix
2013-08-20 11:29:35 +02:00
parent d50b0e6e10
commit 42270991c5
2 changed files with 58 additions and 48 deletions

View File

@@ -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) {