【问题标题】:Magento custom filter on listing page gives incorrect product count列表页面上的 Magento 自定义过滤器提供了不正确的产品计数
【发布时间】:2016-01-06 08:50:18
【问题描述】:

我正在显示产品列表页面。我应用了自定义过滤器来过滤掉产品。

list.phtml中的代码:

$postCodeQueryStr = $this->getRequest()->getParam('post_code');

$_productCollection = $this->getLoadedProductCollection()
        ->addAttributeToFilter(
                array(
                    array('attribute'=>'town', 'like' => ''.$postCodeQueryStr.'%'),
                    array('attribute'=>'post_code', 'like' => ''.$postCodeQueryStr.'%')
                )
        )

        ->clear()->addAttributeToSort('created_at', 'DESC');

显示我使用的计数或产品:

echo $_productCollection->getSize()

这里最初通过$this->getLoadedProductCollection(),我得到所有产品,然后我使用addAttributeToFilter() 过滤它。它实际上显示了有限的产品。我的意思是它过滤掉显示与标准相关的有限产品。

但不是显示过滤后的计数,而是显示整个产品计数,按标准过滤后不显示计数。

我在列表中获得了有限的产品,但它们的数量是旧的(过滤之前)。

【问题讨论】:

  • clear() 的作用是什么?尝试删除它。
  • 我已经试过删除了,还是不行
  • 你知道如何从集合中提取sql查询吗?手动检查结果集。
  • 打印效果很好,但问题是它没有正确显示计数。而且我们不能使用常规的 sql 查询,因为它使用 OOP 来设置许多属性等。您是否在 magento 中使用过滤列表?
  • 评估这个:echo $_productCollection->getSelect()->__toString();(注意有两个_),将查询复制并粘贴到mysql(最好用https://dev.mysql.com/downloads/workbench/),并检查结果集计数是否正确。

标签: php mysql magento filter product


【解决方案1】:

问题是您在模板级别进行过滤,并且在此之前在工具栏中呈现计数。 所以你必须把你的过滤器放在

function getLoadedProductCollection() 

进一步使用函数

public function getProductCollection()
{
    $collection = Mage::getResourceModel('catalog/product_collection')
        ->setStoreId($this->getStoreId())
        ->addCategoryFilter($this);
    return $collection;
}

位于 app/code/core/Mage/Catalog/Model/Category.php

您可以在此处添加过滤器。

我会建议您不要编辑此核心文件并将其切换到您的本地文件夹。

如果有任何疑问,请告诉我。

谢谢,希望它能帮到你。

【讨论】:

  • 请检查下面的完整功能以满足您的需求。只需使用此功能,您就可以完成。
【解决方案2】:

你可以根据你的需要修改下面的函数只需替换下面的这个函数,你就完成了。谢谢

    public function getProductCollection()
    {
        $postCodeQueryStr = $_POST['post_code'];
        $collection = Mage::getResourceModel('catalog/product_collection')
            ->setStoreId($this->getStoreId())
            ->addCategoryFilter($this);
        if($postCodeQueryStr!=''){
$collection->addAttributeToFilter(
                array(
                    array('attribute'=>'town', 'like' => ''.$postCodeQueryStr.'%'),
                    array('attribute'=>'post_code', 'like' => ''.$postCodeQueryStr.'%')
                )
        )
        ->clear()->addAttributeToSort('created_at', 'DESC');
            }
        return $collection;
    }

【讨论】:

  • 您可以修改上述答案,并且可以在其中添加另一种方法。无需有 2 个不同的答案。
  • it doesnt work 表示它不排序/过滤,它只是返回所有产品
  • 您是否通过在此打印某些内容来检查它是否符合条件 if($postCodeQueryStr!=''){
  • 你必须改变 $_GET['post_code'];到 $_POST['post_code'];在上面的代码中。
猜你喜欢
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
相关资源
最近更新 更多