Magento - Создайте коллекцию товаров SALE с учетом правил special_price и промо-цены - PullRequest
1 голос
/ 06 ноября 2011

Мне нужна коллекция продуктов, состоящая из продуктов, для которых действует special_price и / или они соответствуют любому правилу рекламных цен. Сейчас я делаю нечто подобное в другом месте на моем сайте, используя getFinalPrice (), но я не могу добавить это как фильтр, могу ли я?

У меня есть два отдельных блока кода, которые по отдельности более или менее выполняют то, что я хочу, и я думаю, что они должны как-то совмещаться:

$rule = Mage::getModel('catalogrule/rule')->load(9);
$rule->setWebsiteIds("1"); 
$productIdsArray = $rule->getMatchingProductIds(); 
$collection = Mage::getModel('catalog/product')->getCollection()->addAttributeToSelect("*")->addAttributeToFilter("entity_id", array("in", $productIdsArray));

и

$todayDate = date('m/d/y');
$tomorrow = mktime(0, 0, 0, date('m'), date('d')+1, date('y'));
$tomorrowDate = date('m/d/y', $tomorrow);

$collection = Mage::getResourceModel('catalogsearch/advanced_collection')
    ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
    ->addMinimalPrice()
    ->addStoreFilter();

Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
Mage::getSingleton('catalog/product_visibility')->addVisibleInSearchFilterToCollection($collection);

$collection->addAttributeToFilter('special_from_date', array('date' => true, 'to' => $todayDate))
    ->addAttributeToFilter('special_to_date', array('or'=> array(
    0 => array('date' => true, 'from' => $tomorrowDate),
    1 => array('is' => new Zend_Db_Expr('null')))
    ), 'left');

Правила промо-кодов с фильтрацией кода требуют идентификатора промо-правила, но мне действительно интересны ВСЕ правила промо, а не одно конкретное.

Может кто-нибудь помочь мне собрать их воедино, пожалуйста?

Спасибо

~ gpcola

Обновление 10/11/11:

Хорошо, вот что я закончил:

// get catalogue price rule promotion product collection  
$storeId = Mage::app()->getStore()->getId();
$rules = Mage::getModel('catalogrule/rule')
                        ->getResourceCollection()
                        ->addWebsiteFilter(Mage::getModel('core/store')->load($storeId)->getWebsiteId());
foreach($rules as $rule) {
    $promoids =  array_merge($promoids, $rule->getMatchingProductIds());
}

$todayDate  = Mage::app()->getLocale()->date()->toString(Varien_Date::DATETIME_INTERNAL_FORMAT);

$pricecollection = Mage::getResourceModel('catalog/product_collection');
$pricecollection->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds());

// get special price product collection  
$todayDate = date('m/d/y');
$tomorrow = mktime(0, 0, 0, date('m'), date('d')+1, date('y'));
$tomorrowDate = date('m/d/y', $tomorrow);
$pricecollection = Mage::getResourceModel('catalogsearch/advanced_collection')
                        ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
                        ->addMinimalPrice()
                        ->addStoreFilter();

Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($pricecollection);
Mage::getSingleton('catalog/product_visibility')->addVisibleInSearchFilterToCollection($pricecollection);

$pricecollection->addAttributeToFilter('special_from_date', array('date' => true, 'to' => $todayDate))
                        ->addAttributeToFilter('special_to_date', array('or'=> array(
                                0 => array('date' => true, 'from' => $tomorrowDate),
                                1 => array('is' => new Zend_Db_Expr('null')))
                                ), 'left')
;

// merge the collections
$merged_ids = array_merge($pricecollection->getAllIds(), $promoids);
$this->_productCollection = Mage::getResourceModel('catalog/product_collection')
        ->addFieldToFilter('entity_id', $merged_ids)
        ->setPageSize($this->getProductsCount())
        ->setCurPage(1);

return $this->_productCollection;

Но это не возвращает ни одного товара ... У меня есть около 1000 товаров, которые соответствуют одному правилу рекламных цен или другому, поэтому я знаю, что это неправильно. Есть идеи?

о, кстати, если я print_r ($ this -> _ productCollection), я получаю следующее:

Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection Object

( [_flatEnabled: protected] => Массив ( [1] => 1 )

[_productWebsiteTable:protected] => catalog_product_website
[_productCategoryTable:protected] => catalog_category_product
[_addUrlRewrite:protected] => 
[_urlRewriteCategory:protected] => 
[_addMinimalPrice:protected] => 
[_addFinalPrice:protected] => 
[_allIdsCache:protected] => 
[_addTaxPercents:protected] => 
[_productLimitationFilters:protected] => Array
    (
    )

[_productCountSelect:protected] => 
[_isWebsiteFilter:protected] => 
[_priceDataFieldFilters:protected] => Array
    (
    )

[_map:protected] => Array
    (
        [fields] => Array
            (
                [price] => price_index.price
                [final_price] => price_index.final_price
                [min_price] => price_index.min_price
                [max_price] => price_index.max_price
                [tier_price] => price_index.tier_price
                [special_price] => price_index.special_price
            )

    )

[_storeId:protected] => 1
[_itemsById:protected] => Array
    (
    )

[_staticFields:protected] => Array
    (
        [entity_id] => entity_id
        [type_id] => type_id
        [attribute_set_id] => attribute_set_id
    )

[_entity:protected] => Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Flat Object
    (
        [_storeId:protected] => 1
        [_resources:protected] => Mage_Core_Model_Resource Object
            (
                [_connectionTypes:protected] => Array
                    (
                        [pdo_mysql] => Mage_Core_Model_Resource_Type_Db_Pdo_Mysql Object
                            (
                                [_name:protected] => 
                                [_entityClass:protected] => Mage_Core_Model_Resource_Entity_Table
                            )

                    )

                [_connections:protected] => Array
                    (
                        [core_read] => Varien_Db_Adapter_Pdo_Mysql Object
                            (
                                [_transactionLevel:protected] => 0
                                [_connectionFlagsSet:protected] => 1
                                [_ddlCache:protected] => Array
                                    (
                                        [1] => Array
                                            (
...

Это выглядит правильно?

1 Ответ

1 голос
/ 06 ноября 2011

, чтобы получить все правила, используйте коллекцию:

$collection = Mage::getModel('catalogrule/rule')
        ->getResourceCollection();

затем примените к нему метод addWebsiteFilter($websiteIds). Затем вам придется пройтись по нему и получить соответствующие идентификаторы продуктов (как вы делаете в своем коде), и вы можете объединить их что-то вроде:

$merged_ids = array_merge($collection1->getAllIds(), $collection2->getAllIds());

Эта последняя строка (объединяющий материал) также должна работать, чтобы объединить идентификаторы catalogrules со специальными ценами.

НТН

...