2010-10-01 4 views
3

Actuellement, si je veux obtenir une certaine collection de produits, par exemple best-seller, j'utiliser ce qui suit, directement dans mon fichier de modèle:Magento - faire une nouvelle fonction getProductCollection()

$_productCollection = Mage::getResourceModel('reports/product_collection') 
->addAttributeToSelect('name') 
->addAttributeToFilter('visibility', $visibility) 
->addOrderedQty() 
->setOrder('ordered_qty', 'desc') 
$_productCollection->load(); 

. ..et ensuite sortir les produits avec une déclaration foreach.

Quelqu'un peut-il expliquer comment faire un nouveau bloc pour ce faire, qui peut être réutilisé? J'ai trouvé quelques exemples mais ils appellent toujours la liste de produits à partir d'une page de CMS, alors que je veux avoir l'appel à la fonction intégrée directement dans un fichier de modèle, que je peux appeler n'importe où.

Donc, supposons que mon module est configuré, et mon fichier Bestseller.php dans mon dossier Bloquer. Dans ce document, je suppose que je mets ma fonction pour la collecte, quelque chose comme

protected function _getBestsellingCollection() 
{ 
$_BestsellingCollection = Mage::getResourceModel('reports/product_collection') 
->addAttributeToSelect('name') 
->addAttributeToFilter('visibility', $visibility) 
->addOrderedQty() 
->setOrder('ordered_qty', 'desc'); 
$_BestsellingCollection->load(); 
} 
public function getLoadedBestsellingCollection() 
{ 
    return $this->_getBestsellingCollection(); 
} 

Et si oui, comment puis-je appeler cela de mon modèle? Quelque chose comme?

$_productCollection = $this->getLoadedBestsellingCollection() 

Toute aide, ou des pointeurs vers des tutoriels décents, très appréciés!

MISE À JOUR:

Je reçois de plus près, mais je ne parviens pas à l'extension du Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection classe. Si j'ajoute mon code à la fin du fichier Collection.php, comme

public function addBestSelling() 
{ 
$this->addAttributeToSelect('*')->addOrderedQty()->setOrder('ordered_qty', 'desc'); 
return $this; 
} 

puis utilisez

$_productCollection = Mage::getResourceModel('reports/product_collection')->addBestSelling(); 

dans mon fichier modèle phtml, il fonctionne très bien. Mais si je sépare ce code dans mon Bestseller.php, dans mon dossier Modèles de mon module, comme si

class Samsmodule_FeaturedProducts_Model_Bestseller extends Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection 
{ 
public function addBestSelling() 
{ 
    $this->addAttributeToSelect('*')->addOrderedQty()->setOrder('ordered_qty', 'desc'); 
    return $this; 
} 
} 

puis essayer de l'utiliser avec ce qui suit, je reçois une erreur lorsque la page n » t terminer le chargement (pas de message d'erreur)

$_productCollection = Mage::getResourceModel('featuredproducts/bestseller') 
->addMostViewed(); 

Que manque-t-je?

+0

+1 pour une question bien formulée avec beaucoup d'exemples. –

Répondre

1

Les blocs sont pour le rendu HTML. Chaque objet Block a un objet modèle phtml. Lorsque vous utilisez $this à partir d'un modèle phtml, vous renvoyez à l'objet bloc conteneur.

Il ne semble pas que vous rendiez HTML. Il semble que vous voulez aller chercher une liste spécifique de produits à utilisez dans n'importe quel bloc/modèle.

Si les hypothèses ci-dessus sont correctes, au lieu de créer un nouveau bloc que vous voulez créer une nouvelle classe de collection modèle qui étend la classe de l'objet retourné par

Mage::getResourceModel('reports/product_collection'). 

Ajouter votre méthode à cette classe, et appelez-le avec quelque chose comme

Mage::getResourceModel('mymodule/my_collectionclass')-> getLoadedBestsellingCollection() 
+0

Merci Alan. Lisez quelques-uns de vos messages sur votre site et cela devient plus clair! Donc, disons que j'ai Bestseller.php dans mes modules Model folder - la classe est ** Samsmodule_FeaturedProducts_Model_Bestseller ** - est-ce que j'ajoute juste le même appel pour le ** _ getBestsellingCollection ** que dans ma question? Et puis appelez-le dans mon modèle en utilisant ** $ productCollection = Mage :: getResourceModel ('featuredproducts/bestseller') -> getLoadedBestsellingCollection() **? J'ai essayé ça et ça ne marche pas, alors je pense qu'il me manque toujours quelque chose! Mes modèles sont correctement configurés car j'ajoute des choses à l'administrateur avec ce module. –

+0

Vous créez une nouvelle classe. Samsmodule_FeaturedProducts_Model_Bestseller n'a rien de spécial. C'est juste le modèle par défaut. Vous allez définir une classe ** new ** qui étend les rapports/product_collection. Ensuite, vous pouvez ajouter des méthodes à votre contenu de coeurs. –

+0

Voir la mise à jour de ma question –

Questions connexes