2013-08-08 12 views
12

Prima domanda su stackoverflow ... sono eccitato :)Catalogo prezzi Regole applicate a special_price

Attualmente magento usa il prezzo speciale se è inferiore alla regola del prezzo del catalogo applicato. Se la regola del prezzo del catalogo rende il prodotto più economico del prezzo speciale, la regola del prezzo del catalogo definisce il prezzo del negozio.

I am looking for an elegant way to make catalog price rules be applied to the special price (additionally). Maybe there is some store config for it? Maybe there is some neat observer way?

Grazie mille!

risposta

7

Si prega di notare che questa risposta funziona solo per le vecchie versioni di Magento < 1.9. Per le versioni più recenti di Magento, controlla @ Josef's answer.


Sono triste da dire, ho risolto la mia prima vera domanda StackOverflow per la mia:

  1. Goto Mage_CatalogRule_Model_Resource_Rule metodo
  2. Goto _getRuleProductsStmt
  3. Aggiungere questo a quella iniziale di selezione della metodo prima del primo originale ->from:

    $select->from(null, array('default_price' => new Zend_Db_Expr("CASE WHEN pp_default_special.value THEN pp_default_special.value ELSE pp_default_normal.value END")));

  4. Aggiungere questo dopo il primo join() è accaduto

    $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 
    ); 
    

Come funziona:

Quando viene applicata una regola di prezzo di catalogo (tramite back-end o cron) la tabella db catalogrule_product_price è popolata . La suddetta magia SQL si aggiunge allo special_price (se esistente) al set di risultati come colonna default_value, se non viene trovato nessun prezzo speciale, il prezzo normale viene aggiunto.

Il risultato è stato controllato e funziona.

Buon divertimento! E non incidere il nucleo!

+0

Dove è necessario il file?Quando ho cercato in tutti i file ho Fould un paio di file piuttosto contenente "Mage_CatalogRule_Model_Resource_Rule" Thanks :) –

+0

Mage_CatalogRule_Model_Resource_Rule si possono trovare in: app/code/core/Mage/CatalogRule/Modello/Resource/Rule.php –

+0

Grazie. Ho aggiunto nel mio Magento 1.7 al modello/risorse/Rule.php dalla linea 439: try { /** * prezzi aggiornare i prodotti delle regole per ogni sito web separatamente * a causa di max uniscono limite in mysql */ foreach (Mage :: app() -> getWebsites (false) come $ website) { $ select-> from (null, array ('default_price' => nuovo Zend_Db_Expr ("CASE WHEN pp_default_special.value THEN pp_default_special.value ELSE pp_default_normal. valore FINE "))); $ productsStmt = $ this -> _ getRuleProductsStmt ( –

-2

L'ho risolto in un altro modo. È stato semplicemente semplice inserire nel campo del prezzo per esempio 100 e poi nel campo del prezzo speciale 90 quando c'era uno sconto del 10% sulla pagina del prodotto, ma ora ho rimosso il prezzo speciale dalla pagina del prodotto e appena creato la regola del prezzo del catalogo sconto del 10% su quel prodotto (s) e ora funzionano anche altre regole :)

5

Sembra che ci siano alcuni cambiamenti nelle versioni più recenti di Magento! per 1,9 ho dovuto:

copia app/code/core/Mage/CatalogRule/Model/Action/Index/Refresh.php-app/code/local/Mage/CatalogRule/Model/Action/Index/Refresh.php Change _prepareTemporarySelect.

Inserisco qui la funzione per intero. Vengono aggiunti i join per special_price e quindi il prezzo aggiunto alla selezione del campo del prezzo. Preferisce ancora i prezzi di gruppo, perché non li uso mai, ma può essere cambiato facilmente!

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; 
    } 
+1

Ciao Josef - grazie per le tue informazioni aggiuntive. Hai ragione, mentre la mia correzione funziona per <1,8, la tua correzione funziona per> 1.8. –

+0

Quindi, per un po 'di chiarezza - la funzione sopra riportata viene semplicemente incollata in 'app/code/local/Mage/CatalogRule/Model/Action/Index/Refresh.php' o fa' app/code/core/Mage/CatalogRule/Modello/Azione/Indice/Refresh.php' devono ancora essere copiati in 'app/code/local/Mage/CatalogRule/Model/Action/Index/Refresh.php' e' _prepareTemporarySelect' devono essere cambiati, e se è così , a cosa? – KillerDesigner

+1

Copia il file come indicato, sostituisci la funzione _prepareTemporarySelect. Non sono sicuro di come spiegarlo in modo più chiaro. – Josef