Domanda

Così ho questo modello risorsa che ho tirato da un certo codice di amministrazione sul cruscotto. Funziona, ma non riesco ad unirsi ad esso. Facendo spettacoli ->getSelect()->__toString(); nulla? Quindi è questo non una collezione normale? Perché non funzionano come altre collezioni?

La mia ipotesi che, al fine di realizzare quello che voglio realizzare è che sto andando ad avere per estendere il modello di raccolta, ma volevo solo vedere se riesco a ottenere più di un'idea di quello che sta succedendo qui.

$storeId = $this->helper('core')->getStoreId();
$collection = Mage::getResourceModel('sales/report_bestsellers_collection')
    ->setModel('catalog/product')
    ->addStoreFilter($storeId);

$collection->getSelect()->join(
        array('category_product' => 'catalog_category_product'),
        'main_table.product_id = category_product.product_id', 
        array('category_product.*')
    )->where('category_product.category_id = ?', '3')
     ->order('main_table.qty_ordered DESC')
     ->limit($limit);
È stato utile?

Soluzione

Le collezioni di reporting funziona un po 'diverso che le collezioni Mage_Core_Model_Abstract / CRUD. Le collezioni CRUD avranno una query SQL assegnato subito a esemplificazione. La collezione di report, tuttavia, inizializza il proprio istruzione SQL durante il suo funzionamento a carico. Si può vedere questo nel metodo load giù nella classe base astratta per tutte le collezioni di segnalazione.

#File: app/code/core/Mage/Reports/Model/Resource/Report/Collection/Abstract.php
public function load($printQuery = false, $logQuery = false)
{
    if ($this->isLoaded()) {
        return $this;
    }
    $this->_initSelect();
    if ($this->_applyFilters) {
        $this->_applyDateRangeFilter();
        $this->_applyStoresFilter();
        $this->_applyCustomFilter();
    }
    return parent::load($printQuery, $logQuery);
}

Non c'è alcun selezionare fino _initSelect viene chiamato.

L'approccio generale si vorrà prendere qui è

  1. Creare una nuova classe modello di risorse che estende la classe Mage_Reports_Model_Resource_Report_Collection_Abstract

  2. Definire un metodo _applyCustomFilter nella classe

e quindi utilizzare il nuovo modello di risorse. Il tuo metodo _applyCustomFilter sarebbe simile a questa.

protected function _applyCustomFilter()
{
    $return = parent::_applyCustomFilter();
    //manipulate the select all you want here (`$this->getSelect()`)
    return $return;
}

Altri suggerimenti

sembra che si sta cercando di caricare un elenco di prodotti "best seller" (e filtrata da una data categoria), ho fatto in passato con la raccolta del prodotto dal modulo Reports.

Dare a questo un colpo:

$category = Mage::getModel('catalog/category')->load(3);
$report = Mage::getResourceModel('reports/product_collection')
        ->addAttributeToSelect('*')
        ->addOrderedQty()
        ->setOrder('ordered_qty', 'desc')
        ->addCategoryFilter($category);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top