Domanda

Vorrei fare la seguente su 1.9.0.1:

Ottenere 12 casuale upsell-prodotti dalla stessa categoria di prodotto corrente.Devono essere vendibile.Essi non devono essere correlati-prodotti già.Si dovrebbe essere in carrello.

E se non sono 12 in che categoria riempire il resto con prodotti di categoria superiore.

Penso che questo è sempre complesso, ma posso farlo.Solo che non so se posso farlo bene :-)

La mia Domanda è: non devo preoccupare di prestazioni che selezionare la complessità?Che cosa vuoi dire?

Esempi di codice sarebbe bello che posso confrontarli.

È stato utile?

Soluzione

Ho recentemente implementato qualcosa di molto simile e condividere il relativo codice riportato di seguito.Ma prima un po ' di commenti sulle prestazioni, dal momento che era la domanda:

Riflessioni generali su prestazioni per le vostre esigenze:

  • "non dovrebbero essere nel carrello", si è solo limitata significa per la cache di upsell blocco.Io consiglio vivamente di farlo comunque, ma impostare la chiave di cache e la cache di vita solo se il carrello è vuoto.
  • Non ORDER BY RAND() poiché è il risultato di una risorsa per la cpu temp copia tabella.È a carico di tutti i risultati in una tabella temporanea, assegnare un numero casuale per ogni riga e quindi ordinare senza alcun indice.Invece dobbiamo recuperare tutti i candidati id (questo è più veloce e la quantità di dati è gestibile anche per i grandi cataloghi), scegliere alcuni in modo casuale e recuperare queste righe direttamente.Si può leggere su di esso in dettaglio nel mio blog: http://www.schmengler-se.de/en/2015/09/show-random-products-in-magento-you-are-doing-it-wrong/

Specifici problemi di prestazioni con la tua soluzione

  • Non utilizzare addAttributeToSelect('*') con EAV collezioni, selezionare solo ciò di cui avete bisogno
  • Non del tutto sicuro, ma dubito che new Zend_Db_Expr('FIELD(category_id, ' . implode(',', $_cat_order).')')) può utilizzare in modo efficiente il MySQL indici

Soluzione Completa

Questo è un osservatore per il catalog_product_upsell evento.Utilizza la raccolta del prodotto fornito dal prodotto della categoria perché non ho bisogno di ripiego per il genitore, ma sono sicuro che si può regolare.

use Mage_Catalog_Model_Product as Product;
use Mage_Catalog_Model_Product_Link as RelatedProduct;
use Mage_Catalog_Model_Resource_Product_Link_Product_Collection as RelatedProductCollection;

class IntegerNet_AutoUpsell_Model_Observer
{
    /**
     * @see event catalog_product_upsell
     * @param Varien_Event_Observer $observer
     * @throws Mage_Core_Exception
     */
    public function fillUpsellCollection(Varien_Event_Observer $observer)
    {
        $collection = $observer->getCollection();
        if ($collection instanceof RelatedProductCollection
            && $collection->getLinkModel()->getLinkTypeId() === RelatedProduct::LINK_TYPE_UPSELL
            && $collection->count() < $observer->getLimit('upsell')
        ) {
            $this->addItemsFromCategory($collection, $observer->getLimit('upsell') - $collection->count(), $observer->getProduct());
        }
    }
    protected function addItemsFromCategory(RelatedProductCollection $collection, $numberOfItems, Product $product)
    {
        /** @var Mage_Catalog_Model_Resource_Product_Collection $productsToAdd */
        $productsToAdd = $this->_getProductCategory($product)->getProductCollection();
        $productsToAdd
            ->addStoreFilter()
            ->addIdFilter(array_merge([$product->getId()], $collection->getAllIds()), true)
            ->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds());

        $candidateIds = $productsToAdd->getAllIds();
        $choosenIds = [];
        $maxKey = count($candidateIds)-1;
        while (count($choosenIds) < $numberOfItems)) {
            $randomKey = mt_rand(0, $maxKey);
            $choosenIds[$randomKey] = $candidateIds[$randomKey];
        }    
        $productsToAdd
            ->addIdFilter($choosenIds)
            ->addMinimalPrice()
            ->addFinalPrice()
            ->addTaxPercents()
            ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
            ->addUrlRewrite();
        foreach ($productsToAdd as $product) {
            $collection->addItem($product);
        }
    }

    /**
     * @param Mage_Catalog_Model_Product $product
     * @return Mage_Catalog_Model_Category
     */
    protected function _getProductCategory(Product $product)
    {
        $category = $product->getCategoryCollection()
            ->setPageSize(1)
            ->getFirstItem();
        return $category;
    }
}

Alcune parti che vorrei evidenziare:

->addIdFilter(array_merge($product->getId(), $collection->getAllIds()), true)

Questo esclude il prodotto stesso e per i prodotti che sono già definiti manualmente come upsell prodotti (lascio a loro e solo a riempire gli spazi vuoti con casuale prodotti)

->addMinimalPrice()
->addFinalPrice()
->addTaxPercents()
->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
->addUrlRewrite();

Questo prepara il prodotto collezione per caricare i dati necessari per la visualizzazione dei prezzi, il prodotto di collegamento e gli eventuali attributi configurato come "utilizzato nella scheda di prodotto", ma non di più.

Altri suggerimenti

Ecco il mio codice di lavoro:

//get needed variables
$_current_prod = Mage::registry('current_product');
$_current_cat =  Mage::getModel('catalog/layer')->getCurrentCategory();
$_current_cat_id = $_current_cat->getId();
$_parent_cat_id =  $_current_cat->getParentId();
//did array because later on it may get more complex order with more ids or I want to sort it different
$_cat_order = array($_current_cat_id,$_parent_cat_id);
//getting related products to filter from collection
$_related_products = $_current_prod->getRelatedProductIds();

//getting cart items to filter from collection
$_session= Mage::getSingleton('checkout/session');
$_cart_products = array();
foreach($_session->getQuote()->getAllItems() as $_item)
{
   $_cart_products[] = $_item->getProductId();
}

//merge product arrays to filter from collection
$_inuse_products = array_unique(array_merge($_related_products, $_cart_products));      

//getting collection
$_productCollection = Mage::getModel('catalog/product')
->getCollection()
->joinField('category_id', 'catalog/category_product', 'category_id', 'product_id = entity_id', null, 'left')
->addAttributeToSelect('*')
->addAttributeToFilter('entity_id', array('nin' => $_inuse_products))
->addAttributeToFilter('entity_id', array('neq' => $_current_prod->getId()))
->addAttributeToFilter('category_id', array(
    array('finset' => $_current_cat_id),
    array('finset' => $_parent_cat_id))
);

//sort collection = deepest category level first and limit it to 12
$_productCollection->getSelect()->order(new Zend_Db_Expr('FIELD(category_id, ' . implode(',', $_cat_order).')'))->limit(12);
.

Immagino che ci sia un po 'da ottimizzare?:)

Metti questo a View.phtml funzionerà.devi solo regolare il CSS

<?php $categories = $_product->getCategoryIds(); ?> 
<?php $result = array(); 
foreach($categories as $cat_id) { 
$category = Mage::getModel('catalog/category'); 
$category->load($cat_id); 
$collection = $category->getProductCollection(); 
foreach ($collection as $product) { 
$result[] = $product->getId(); 
} 
} 
?> 
<div class="box-others-also-like" style=" margin:0 auto;"> 
<ul> 
<?php if(sizeof($result) >= 10) 
{ 
$ourneed = array_rand($result,10); 
foreach($ourneed as $cc) 
{ 
$thisproduct= Mage::getModel('catalog/product')->load($result[$cc]); 
?> 
<li style=" border:1px solid #ccc; float:left; width:140px; margin:10px 5px 0 0; overflow:hidden;"> 
<a href="<?php echo $thisproduct->getProductUrl(); ?>" title="<?php echo $thisproduct->getName(); ?>" ><img src="<?php echo $this->helper('catalog/image')->init($thisproduct,'small_image')->resize(140) ?>" width="140" height="140" alt="<?php echo $thisproduct->getName(); ?>" /></a> 
<a href="<?php echo $thisproduct->getProductUrl(); ?>" title="<?php echo $thisproduct->getName(); ?>" title="<?php echo $thisproduct->getName(); ?>" >
<h3 style=" font:12px/1.55 arial; width:140px; height:4.25em; overflow:hidden;"><?php echo $thisproduct->getName(); ?></h3></a> 
</li> 
<?php } ?> 
<?php }else { 
foreach($result as $cc) 
{ 
$thisproduct= Mage::getModel('catalog/product')->load($cc); 
?> 
<li> 
<a href="<?php echo $thisproduct->getProductUrl(); ?>" title="<?php echo $thisproduct->getName(); ?>" ><img src="<?php echo $this->helper('catalog/image')->init($thisproduct, 'small_image')->resize(200) ?>" width="200" height="200" alt="<?php echo $thisproduct->getName(); ?>" /></a> </li> 
<?php } 
} 
?> 
</ul> 
</div>
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top