Pagina Crea categoria che visualizza tutti i prodotti a prezzo speciale


12

Fondamentalmente, ho creato una categoria "Prodotti in vendita", che vorrei contenere automaticamente tutti i prodotti nel mio catalogo a cui è stato applicato un prezzo speciale (tramite Catalogo> Gestisci prodotti). Vorrei che la pagina conservasse le funzionalità di navigazione e ordinamento a più livelli contenute in una pagina di categoria Magento standard.

Sembra che questo sia qualcosa che sarebbe prezioso per la maggior parte degli utenti di Magento, e sono sorpreso che non sia incluso come parte delle funzionalità di base.

Ho provato più di una dozzina di risposte, post di blog e forum su Stack Exchange, e finora nulla ha funzionato. Qualcuno ha una soluzione programmatica per questo?

=== MODIFICA ===

Basato sulla critica di @ pspahn nei commenti qui sotto, ho deciso di perseguire un metodo alternativo per ottenere funzionalità simili. Detto questo, se sei interessato a perseguire questa linea, @ sander-mangel descrive un metodo che sembra del tutto fattibile.


Mi sembra che il requisito di "contenere automaticamente tutti i prodotti a prezzo speciale" sia un po 'eccessivo. Presumo che il risultato finale sia che si desidera una pagina con prodotti a prezzo speciale su di essa e si presenta come una pagina di categoria. Sembra invece che tu possa semplicemente creare il tuo modello / collezione (basato su prodotti con un prezzo speciale) e utilizzare quella raccolta in modelli basati sulle pagine della vista categoria. Semplicemente non vedo una categoria che viene popolata automaticamente come una buona soluzione, ad esempio, come si impedisce a un utente di modificarla?
pspahn,

@pspahn Grazie per la tua risposta. Capisco la tua critica e sono d'accordo con il tuo ragionamento. Potrei utilizzare il metodo descritto da Sander Mangel con un osservatore aggiuntivo category_save_after per buona misura, ma sembra eccessivo. Vado avanti con una soluzione alternativa.
rokkor,

@pspahn - Non capisco cosa intendi con "come si impedisce a un utente di modificarlo" - puoi spiegare un po 'di più?
ProxiBlue,

@ProxiBlue Fondamentalmente, se si crea una categoria e si popolano automaticamente i prodotti, un utente amministratore può semplicemente entrare in quella categoria nel back-end e aggiungere / rimuovere prodotti manualmente.
pspahn,

@pspahn ok, con l'utente ho frainteso come utente front-end.
ProxiBlue,

Risposte:


8

Il modo più semplice per farlo è creare un'estensione personalizzata che funzioni con un osservatore e un cronjob.

Creare una categoria per i prodotti di vendita. In questo modo puoi utilizzare le normali funzionalità di Magento nel frontend come la navigazione a più livelli ecc.

Per ottenere automaticamente i prodotti in questa categoria utilizzeremo l'osservatore e il cronjob. L'osservatore osserverà l' catalog_product_save_afterevento che viene attivato quando un prodotto viene salvato nel back-end. Quando questo accade è possibile controllare la special_price, special_price_fromla data e special_date_tola data per determinare se è necessario mettere il prodotto nella categoria di vendita o rimuoverlo da lì.

Il cronjob è lì per le date speciali da e per. Ogni notte dopo mezzanotte svuotare prima la categoria di vendita di tutti i prodotti. Quindi utilizzare una raccolta per recuperare tutti i prodotti che hanno un prezzo speciale e rientrano nello speciale da e fino ad oggi. In tal caso, spostali in questa categoria di vendita.


7

La soluzione offerta da @SanderMangel è di prim'ordine. Posso aiutare a espandere questo con un po 'di codice, che attualmente uso nel mio modulo Prodotti di categoria automatizzati / dinamici - che ha la capacità di fare regole di categoria di prodotti su speciali

Il codice regola una raccolta di prodotti standard per ottenere tutti i prodotti con un prezzo speciale impostato, il giorno in cui il codice viene eseguito. Puoi usarlo nel cron per ripopolare le categorie alle 00:00 e assicurarti che rimangano aggiornate.

Nota che il codice viene estratto da un modulo più grande, quindi ho compattato le parti pertinenti qui per te. Potrebbero esserci una o due variabili che non sono rappresentate in questo estratto, ma sarebbero facili da dedurre o semplicemente chiedere :)

L'oggetto $ category è la categoria effettiva che deve contenere i prodotti. Il codice seguente ti permetterà anche di specificare lo sconto in un valore% :)

$collection = $category->getProductCollection();

$todayDate = Mage::app()->getLocale()->date()->toString(Varien_Date::DATE_INTERNAL_FORMAT);
$collection->addAttributeToFilter(array(
    array(
        'attribute' => "special_to_date",
        'null' => true
    ),
    array(
        'attribute' => "special_to_date",
        'from' => $todayDate,
        //'to'      => $todayDate,
        'date' => true
    )
));
$collection->addAttributeToFilter(array(
    array(
        'attribute' => "special_from_date",
        'null' => true
    ),
    array(
        'attribute' => "special_from_date",
        //'from'    => $todayDate,
        'to' => $todayDate,
        'date' => true
    )
));

$collection->addAttributeToSelect('special_price','left');
$collection->addAttributeToSelect('price','left');
$select = $collection->getSelect();

if (strpos($value, '%') > 0) {
    $value = str_replace('%', '', $value);
    $select->where('( 100 - (( at_special_price.value * 100 ) / at_price.value ) )  ' . $operator . ' ' . $value);
} else {
    $select->where('((at_price.value - at_special_price.value)) ' . $operator . ' ' . $value);
}

Ora, si noti che la raccolta non restituirà i prodotti, in quanto contiene collegamenti alle normali tabelle di collegamento del prodotto <-> catalogo. Dato che non sei interessato agli attuali prodotti collegati, devi eliminare quella relazione di tabella dalla raccolta.

Uso il seguente codice per farlo:

/**
 * Remove Catalog Product Link elements from collection
 * 
 * @param type $collection
 * @return type
 */
public function removeCatProPart($collection)
{
    $select = $collection->getSelect();
    $fromPart = $select->getPart(Zend_Db_Select::FROM);
    $select->reset(Zend_Db_Select::FROM);

    if (array_key_exists('cat_pro', $fromPart)) {
        unset($fromPart['cat_pro']);
        // also remove any reference to the table in the rest of the query
        $columns = $select->getPart(Zend_Db_Select::COLUMNS);
        $columnRemoved = false;
        foreach ($columns as $columnKey => $column) {
            if ($column[0] == 'cat_pro') {
                unset($columns[$columnKey]);
                $columnRemoved = true;
            }
        }

        if ($columnRemoved) {
            $select->setPart(Zend_Db_Select::COLUMNS, $columns);
        }

        $orderPart = $select->getPart(Zend_Db_Select::ORDER);
        $orderRemoved = false;
        foreach ($orderPart as $orderKey => $order) {
            if ($order[0] == 'cat_pro') {
                unset($orderPart[$orderKey]);
                $orderRemoved = true;
            }
        }

        if ($orderRemoved) {
            $select->setPart(Zend_Db_Select::ORDER, $orderPart);
        }
    }
    $select->setPart(Zend_Db_Select::FROM, $fromPart);
    return $collection;
}

come bonus aggiuntivo, puoi utilizzare la stessa tecnica per adattare la raccolta di prodotti del catalogo e trovare prodotti in modalità speciale a causa delle regole del catalogo:

$storeDate = Mage::app()->getLocale()->storeTimeStamp($this->getStoreId());
$value = $this->getValue();
$conditions = 'price_rule.product_id = e.entity_id AND ';
$conditions .= "(from_time = 0
    OR from_time <= " . $storeDate . ")
    AND (to_time = 0
    OR to_time >= " . $storeDate . ") AND ";
$conditions .= "price_rule.rule_id IN (" . $value . ")";
$collection->getSelect()->joinInner(
        array('price_rule' => $collection->getTable('catalogrule/rule_product')), $conditions);
$collection->setFlag('applied_catalog_rule_id', true);
$collection->setFlag('applied_rule', true);

Una volta che hai la raccolta funzionante, tutto ciò che devi fare è ottenere tutti gli ID dalla raccolta, capovolgere l'array e usare $category->setPostedProducts($products);e una $ categoria-> save () l; per completare l'aggiornamento.

Per completezza, ecco il mio cron giornaliero che aggiorna le categorie dinamiche. (di nuovo, si riferisce a metodi non inclusi qui, ma sono sicuro che ti porterà nella giusta direzione

Divertiti :)

public static function rebuildAllDynamic($schedule)
{
    try {
        $tempDir = sys_get_temp_dir() . "/";
        $fp = fopen($tempDir . "dyncatprod_rebuild.lock", "w+");
        if (flock($fp, LOCK_EX | LOCK_NB)) {
            if (Mage::getStoreConfig('dyncatprod/debug/enabled')) {
                   mage::log("DynCatProd - rebuildAllDynamic");
            }
            if (!Mage::getStoreConfig('dyncatprod/rebuild/max_exec')) {
                ini_set('max_execution_time', 3600); // 1 hour
            }
            $categories = Mage::getModel('catalog/category')
                ->getCollection()
                ->addAttributeToSelect('*')
                ->addIsActiveFilter()
                ->addAttributeToFilter('dynamic_attributes', array('notnull' => true));

            foreach ($categories as $category) {
                $products = Mage::helper('dyncatprod')->getDynamicProductIds($category);
                if (is_array($products)) {
                    if (Mage::getStoreConfig('dyncatprod/debug/enabled')) {
                        mage::log("rebuilding :" . $category->getName() . ' ' . $category->getPath() );
                    }
                    $products = array_flip($products);
                    $category->setPostedProducts($products);
                    $category->setIsDynamic(true);
                    $category->save();
                }
            }
            flock($fp, LOCK_UN); 
            unlink($tempDir . "dyncatprod_rebuild.lock");
        } else {
            mage::log('Could not execute cron for rebuildAllDynamic -file lock is in place, job may be running');
        }
    } catch (Exception $e) {
        flock($fp, LOCK_UN); 
        unlink($tempDir . "dyncatprod_rebuild.lock");
        mage::logException($e);
        return $e->getMessage();
    }
}

rif: http://www.proxiblue.com.au/magento-dynamic-category-products.html


5

Ecco la collezione che dovrebbe darti il ​​set di risultati di tutti i prodotti a prezzo speciale nel tuo catalogo che puoi visualizzare in una pagina

$collection = Mage::getResourceModel('catalog/product_collection')
    ->addAttributeToSelect('price')
    ->setStoreId($this->getStoreId());

$date = strtotime(date('Y-m-d')); $current_date = date("Y-m-d hh:mm:ss",$date);

$collection = $collection
    ->addAttributeToFilter('price',
        array('gt'=>0))
    ->addAttributeToFilter('visibility',
        array('neq'=>Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE));

if (Mage::getStoreConfigFlag(Mage_Catalog_Helper_Product_Flat::XML_PATH_USE_PRODUCT_FLAT, $this->getStoreId())){
    $collection = $collection->addAttributeToFilter('special_price',array('lt'=>new Zend_Db_Expr('e.price')));
}
else{
    $collection = $collection->addAttributeToFilter(array(
        array('attribute'=>'special_price','lt'=>new Zend_Db_Expr('at_price.value'))
    ));
}

$collection = $collection->addAttributeToFilter(array(
        array('attribute'=>'special_from_date','lteq'=>$current_date),
        array('attribute'=>'special_from_date','eq'=>''),
        array('attribute'=>'special_from_date','null'=>true)
    ),'','left')
    ->addAttributeToFilter(array(
        array('attribute'=>'special_to_date','gteq'=>$current_date),
        array('attribute'=>'special_to_date','eq'=>''),
        array('attribute'=>'special_to_date','null'=>true)
            ),'','left');

$collection->getSelect()->group('e.entity_id');

return $collection;

Esistono diversi modi in cui è possibile farlo: creare un nuovo modulo che ha il proprio controller, blocco e modello molto simili al modulo categoria Mage oppure si ignora il modulo categoria Mage per eseguire la raccolta sopra solo quando viene selezionata una categoria speciale dal cliente. Questo può essere facilmente configurato nel sistema -> configurazione del modulo.

Se riesci a spendere pochi sterline, consiglierei la seguente estensione su Magento Connect

Per Magento 1 -:

http://www.magentocommerce.com/magento-connect/dynamic-sale-category.html ( http://www.scommerce-mage.co.uk/magento-dynamic-sale-category.html )

Per Magento 2 -:

https://www.scommerce-mage.com/magento2-dynamic-sale-category.html

Spero che sia d'aiuto!

Saluti S


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.