Question

J'ai donc ce modèle de ressources que j'ai tiré à partir du code d'administration sur le tableau de bord. Il fonctionne, mais je ne peux pas sembler à se joindre à elle. Faire des spectacles de ->getSelect()->__toString(); rien? Alors, est-ce pas une collection normale? Pourquoi est-il pas de travail comme les autres collections?

Je pense que pour accomplir ce que je veux accomplir est que je vais devoir étendre le modèle de collection, mais je voulais juste voir si je peux obtenir plus d'une idée de ce qui se passe ici.

$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);
Était-ce utile?

La solution

Les collections de rapports fonctionne un peu différemment que les collections Mage_Core_Model_Abstract / CRUD. Les collections de CRUD auront une requête SQL attribué immédiatement à l'instanciation. La collection de rapports, toutefois, initialise son instruction SQL lors de son opération de chargement. Vous pouvez le voir dans la méthode load dans la classe de base abstraite pour toutes les collections de rapports.

#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);
}

Il n'y a pas jusqu'à sélectionner _initSelect est appelé.

L'approche générale que vous aurez envie de prendre ici est

  1. Créer une nouvelle classe de modèle de ressource qui étend la classe Mage_Reports_Model_Resource_Report_Collection_Abstract

  2. Définir une méthode _applyCustomFilter dans votre classe

puis utilisez votre nouveau modèle de ressources. Votre méthode _applyCustomFilter ressemblerait à quelque chose comme ça.

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

Autres conseils

On dirait que vous essayez de charger une liste de produits « meilleure vente » (et filtrée par une catégorie donnée), je l'ai fait dans le passé en utilisant la collection de produits à partir du module Rapports.

Donner cette une photo:

$category = Mage::getModel('catalog/category')->load(3);
$report = Mage::getResourceModel('reports/product_collection')
        ->addAttributeToSelect('*')
        ->addOrderedQty()
        ->setOrder('ordered_qty', 'desc')
        ->addCategoryFilter($category);
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top