【发布时间】: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