目录价格规则适用于special_price

时间:2013-08-08 07:32:09

标签: magento catalog discount

关于stackoverflow的第一个问题......我很兴奋:)

目前magento使用特价,如果它低于应用的目录价格规则。如果目录定价规则使产品比特价便宜,则目录定价规则定义商店价格。

  

我正在寻找一种优雅的方式来应用目录价格规则   特价(另外)。也许有一些商店配置呢?也许   有一些整洁的观察者的方式?

非常感谢你!

3 个答案:

答案 0 :(得分:8)

适用于当前的Magento 1.9.3.10。刚刚更新后在项目中测试了它。约瑟夫尝试了另一种可行的方法。


我很伤心地说,我解决了我的第一个真正的计算器问题,我自己的:

  1. 转到Mage_CatalogRule_Model_Resource_Rule
  2. 转到方法_getRuleProductsStmt
  3. 将其添加到第一个原始->from之前的方法的初始选择中:

      

    $ select-> from(null,array('default_price'=> new Zend_Db_Expr(“CASE)   当pp_default_special.value那么pp_default_special.value ELSE   pp_default_normal.value END“)));

  4. 在第一次加入()后发生

    $specialPriceAttr  = Mage::getSingleton('eav/config')
                        ->getAttribute(Mage_Catalog_Model_Product::ENTITY, 'special_price');
    $specialPriceTable = $specialPriceAttr->getBackend()->getTable();
    $specialPriceAttributeId= $specialPriceAttr->getId();
    $joinCondition2 = '%1$s.entity_id=rp.product_id AND (%1$s.attribute_id=' . $specialPriceAttributeId . ') 
                                                    AND %1$s.store_id=%2$s';
    $select->join(
            array('pp_default_special'=>$specialPriceTable),
            sprintf($joinCondition2, 'pp_default_special', Mage_Core_Model_App::ADMIN_STORE_ID), null
    );
    
  5. 工作原理:

    当应用目录定价规则时(通过后端或cron),将填充db表catalogrule_product_price。上面的SQL魔法将special_price(如果存在)加到结果集中作为列default_value,如果没有找到special_price则会加入常规价格。

    结果已经过检查并且正在运行。

    玩得开心!并且不要破坏核心!

答案 1 :(得分:5)

新的Magento版本似乎有些变化! 对于1.9我必须:

app/code/core/Mage/CatalogRule/Model/Action/Index/Refresh.php复制到app/code/local/Mage/CatalogRule/Model/Action/Index/Refresh.php 改变_prepareTemporarySelect。

我在这里完整发布了这个功能。添加了special_price的联接,然后将价格添加到价格字段的选择中。它仍然更喜欢团体价格,因为我从不使用它们,但这可以很容易地改变!

protected
function _prepareTemporarySelect(Mage_Core_Model_Website $website)
    {
    /** @var $catalogFlatHelper Mage_Catalog_Helper_Product_Flat */
    $catalogFlatHelper = $this->_factory->getHelper('catalog/product_flat');
    /** @var $eavConfig Mage_Eav_Model_Config */
    $eavConfig = $this->_factory->getSingleton('eav/config');
    $priceAttribute = $eavConfig->getAttribute(Mage_Catalog_Model_Product::ENTITY, 'price');
    $specialPriceAttr = Mage::getSingleton('eav/config')->getAttribute(Mage_Catalog_Model_Product::ENTITY, 'special_price');
    $specialPriceTable = $specialPriceAttr->getBackend()->getTable();
    $specialPriceAttributeId = $specialPriceAttr->getId();
    $select = $this->_connection->select()->from(array(
        'rp' => $this->_resource->getTable('catalogrule/rule_product')
    ) , array())->joinInner(array(
        'r' => $this->_resource->getTable('catalogrule/rule')
    ) , 'r.rule_id = rp.rule_id', array())->where('rp.website_id = ?', $website->getId())->order(array(
        'rp.product_id',
        'rp.customer_group_id',
        'rp.sort_order',
        'rp.rule_product_id'
    ))->joinLeft(array(
        'pg' => $this->_resource->getTable('catalog/product_attribute_group_price')
    ) , 'pg.entity_id = rp.product_id AND pg.customer_group_id = rp.customer_group_id' . ' AND pg.website_id = rp.website_id', array())->joinLeft(array(
        'pgd' => $this->_resource->getTable('catalog/product_attribute_group_price')
    ) , 'pgd.entity_id = rp.product_id AND pgd.customer_group_id = rp.customer_group_id' . ' AND pgd.website_id = 0', array());
    $storeId = $website->getDefaultStore()->getId();
    if ($catalogFlatHelper->isEnabled() && $storeId && $catalogFlatHelper->isBuilt($storeId))
        {
        $select->joinInner(array(
            'p' => $this->_resource->getTable('catalog/product_flat') . '_' . $storeId
        ) , 'p.entity_id = rp.product_id', array());
        $priceColumn = $this->_connection->getIfNullSql($this->_connection->getIfNullSql('pg.value', 'pgd.value') , $this->_connection->getIfNullSql('p.special_price', 'p.price'));
        }
      else
        {
        $select->joinInner(array(
            'pd' => $this->_resource->getTable(array(
                'catalog/product',
                $priceAttribute->getBackendType()
            ))
        ) , 'pd.entity_id = rp.product_id AND pd.store_id = 0 AND pd.attribute_id = ' . $priceAttribute->getId() , array())->joinLeft(array(
            'pspd' => $specialPriceTable
        ) , 'pspd.entity_id = rp.product_id AND (pspd.attribute_id=' . $specialPriceAttributeId . ')' . 'AND pspd.store_id = 0', array())->joinLeft(array(
            'p' => $this->_resource->getTable(array(
                'catalog/product',
                $priceAttribute->getBackendType()
            ))
        ) , 'p.entity_id = rp.product_id AND p.store_id = ' . $storeId . ' AND p.attribute_id = pd.attribute_id', array())->joinLeft(array(
            'psp' => $specialPriceTable
        ) , 'psp.entity_id = rp.product_id AND (psp.attribute_id=' . $specialPriceAttributeId . ')' . 'AND psp.store_id = ' . $storeId, array());
        $priceColumn = $this->_connection->getIfNullSql($this->_connection->getIfNullSql('pg.value', 'pgd.value') , $this->_connection->getIfNullSql('psp.value', $this->_connection->getIfNullSql('pspd.value', $this->_connection->getIfNullSql('p.value', 'pd.value'))));
        }

    $select->columns(array(
        'grouped_id' => $this->_connection->getConcatSql(array(
            'rp.product_id',
            'rp.customer_group_id'
        ) , '-') ,
        'product_id' => 'rp.product_id',
        'customer_group_id' => 'rp.customer_group_id',
        'from_date' => 'r.from_date',
        'to_date' => 'r.to_date',
        'action_amount' => 'rp.action_amount',
        'action_operator' => 'rp.action_operator',
        'action_stop' => 'rp.action_stop',
        'sort_order' => 'rp.sort_order',
        'price' => $priceColumn,
        'rule_product_id' => 'rp.rule_product_id',
        'from_time' => 'rp.from_time',
        'to_time' => 'rp.to_time'
    ));
    return $select;
    }

答案 2 :(得分:-2)

我以另一种方式修复它。当产品页面上有10%的折扣时,很容易进入价格区域(例如100)然后进入特价区域90但是现在我从产品页面中删除了特价并且刚刚创建了目录价格规则10%折扣到该产品(s)现在其他规则也有效:)