0

首先,我是 Magento 的新手,所以我对它的结构和功能知之甚少。

我正在构建一个用于过滤和显示产品的自定义模块。到目前为止我做得很好,但现在我正在努力过滤和展示产品呵呵。

我在app/code/local/Mage/Catalog/Block/Product/Filter.php Source 中创建了一个目录块:

<?php
class Mage_Catalog_Block_Product_Filter extends Mage_Catalog_Block_Product_List
{      
    protected function _beforeToHtml()
    {
        $table = Mage::getConfig()->getTablePrefix() . 'custom_table';

        //GET
        $param1 = $this->getRequest()->getParam('param1');
        $param2 = $this->getRequest()->getParam('param1');
        $param3 = $this->getRequest()->getParam('param3');
        $param4 = $this->getRequest()->getParam('param4');

        $sql = "SELECT sku FROM " . $table . " WHERE param1 = '".$param1."' AND param2 = '".$param2."' AND param3 = '".$param3."' AND param4 = '".$param4."'";
        $query = Mage::getSingleton('core/resource')
        ->getConnection('core_read')
        ->fetchAll( $sql );

        $res = $query[0];//only one result expected

        $collection = Mage::getResourceModel('catalog/product_collection');
        $collection->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds());

        $collection = $this->_addProductAttributesAndPrices($collection)
            ->addStoreFilter()
            ->addAttributeToFilter('sku', array('in' => $res['sku']))
            ->setPageSize($this->getProductsCount())
            ->setCurPage(1)
        ;

        $this->setProductCollection($collection);
        return parent::_beforeToHtml();
    }

}
?>

我的模块使用.phtml。资源:

<?php
echo $this->getLayout()->createBlock('catalog/product_filter')->setTemplate('catalog/product/list.phtml')->toHtml();

问题是:它应该只加载具有从数据库中检索到的 SKU 的产品。但是,相反,它总是加载相同的产品,不管我在 addAttributeToFilter 中放了什么。

出于测试目的,我从 Filter.php 中删除了所有内容(类声明除外)并且行为是相同的。我还在 addAttributeToFilter 中硬编码了一个 sku,没有运气。我检查了查询和结果,它是正确的。

我尝试过的其他方法:

$_testproductCollection = Mage::getResourceModel('catalog/product_collection')
        ->addAttributeToSelect('*')
        ->addAttributeToFilter( 'sku', array( 'in' => array( $res['sku'] ) ) );
        $this->setProductCollection($_testproductCollection);

/ ----------------------------- /

$collection = Mage::getModel('catalog/product')->getCollection()
->addAttributeToFilter('sku', array('in' => $idsProdutos));
$this->setProductCollection($collection);

/ ----------------------------- /

$products = Mage::getModel('catalog/product')->getCollection();
        $products->addAttributeToFilter('sku', 'asd');//show only skus starting with... 
        $products->addAttributeToFilter('status', 1);//enabled
        $products->addAttributeToFilter('visibility', 4);//catalog, search
        $products->addAttributeToSelect('*');
        $products->load();
        $this->setProductCollection($products);

非常感谢任何帮助。

编辑

找到了解决方案!

在脚本的末尾(在 之前return),我包含了这一行:

$this->_productCollection = $collection;

出于某种原因,现在它正在工作。谢谢您的帮助!

4

1 回答 1

2

如果您只退回 1 个 Sku,请不要使用集合,只需使用产品:

$product = Mage::helper('catalog/product')->getProduct('SKU_GOES_HERE', Mage::app()->getStore()->getId(), 'sku'); 

如果您真的需要一个集合,您可以使用 entity_id 进行过滤$product->getId()

于 2013-07-25T20:42:27.163 回答