【问题标题】:Magento's addAttributeToFilter not workingMagento 的 addAttributeToFilter 不起作用
【发布时间】:2013-07-25 06:37:51
【问题描述】:

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

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

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

<?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;

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

【问题讨论】:

  • addAttributeToFilter 仅与 EAV 属性一起使用。 SKU 存储为产品表中的普通列。您可以尝试使用addFieldToFilter。虽然,如果您只寻找一种产品,您应该遵循 dagfr 的回答。
  • 尝试使用 addFieldToFilter,但仍然无法正常工作。由于某种原因,集合没有正确设置(?)。正如我对 dagfr 所说,我最多可以退回 3 个 sku,所以我需要收藏。

标签: magento


【解决方案1】:

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

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

如果你真的需要一个集合,你可以使用 $product-&gt;getId() 过滤 entity_id

【讨论】:

  • 实际上我最多可以退回 3 个 sku。这就是我使用集合并使用“in”进行过滤的原因。
  • 我试过这个,但总是返回相同的产品,不管我在收藏中放了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
相关资源
最近更新 更多