从 list.phtml 结果中排除产品(magento)

Posted

技术标签:

【中文标题】从 list.phtml 结果中排除产品(magento)【英文标题】:Exclude products from list.phtml results (magento) 【发布时间】:2012-07-23 19:55:34 【问题描述】:

有没有办法从 Magento 的 list.phtml 视图中强制排除项目(通过属性值)? 我们的产品应该是可购物的、可单独查看的,但不应通过搜索或导航到其类别来找到。

【问题讨论】:

为什么要把它们添加到分类中呢? 【参考方案1】:

您可以扩展Mage_Catalog_Model_CategorygetProductCollection 方法(然后根据需要创建自定义 Block 类来替换某些模板)。

假设,这是在一个名为 <YourNamespace>_<YourModule> 的模块中完成的,如下所示:

class <YourNamespace>_<YourModule>_Model_Category extends Mage_Catalog_Model_Category 
    public function getProductCollection() 
        $collection = parent::getProductCollection()
        foreach($collection as $key => $item) 
            if (<YOUR_REMOVE_CRITERIA_HERE>) 
                $collection->removeItemByKey($key);
            
        
    

&lt;YOUR_REMOVE_CRITERIA_HERE&gt; 可以是任何东西,从配置选项到集合中项目(产品)的属性。

如果您只希望产品不在类别产品列表中列出,则更简单的解决方案是将它们从类别中删除。

希望我能帮上忙,

lg,

弗洛

【讨论】:

如果您只希望产品不在类别产品列表中列出,则更简单的解决方案是将它们从类别中删除。是的,显而易见的解决方案:) 您能指导我完成扩展和创建自定义类的步骤吗?或者向我指出可以引导您完成此过程的另一个资源的方向? 自定义模块教程可以在这里找到:http://www.magentocommerce.com/wiki/5_-_modules_and_development/0_-_module_development_in_magento/custom_module_with_custom_database_table 我试图避免创建自定义模块...所以,我在 list.phtml 中尝试以下内容: $_productCollection=$this->getLoadedProductCollection(); $_helper = $this->helper('目录/输出'); $_productCollection->addAttributeToSelect(array('status', 'visibility', 'web_availability')); $_productCollection->addAttributeToFilter('status', 1); $_productCollection->addAttributeToFilter('visibility', 4); $_productCollection->addAttributeToFilter('web_availability', array('gteq' => 524));但结果并未按 web_availability 过滤。有没有我遗漏的语法?【参考方案2】:

我们最终在没有创建新模块的情况下解决了这个问题。我们在 /app/code/local/mage/catalog/block/product 中创建了对 list.php 的覆盖,并包含以下代码行:

$collection->clear()
->addAttributeToFilter('my_attribute_name', array('gteq'=> 524 )) //custom attrib ID
->addAttributeToFilter('visibility', array('eq'=> 4 )) // Visibility is equal to "Catalog/Search"
->load();

紧接着:

protected function _beforeToHtml()

    $toolbar = $this->getToolbarBlock();

    // called prepare sortable parameters
    $collection = $this->_getProductCollection();

    // use sortable parameters
    if ($orders = $this->getAvailableOrders()) 
        $toolbar->setAvailableOrders($orders);
    
    if ($sort = $this->getSortBy()) 
        $toolbar->setDefaultOrder($sort);
    
    if ($dir = $this->getDefaultDirection()) 
        $toolbar->setDefaultDirection($dir);
    
    if ($modes = $this->getModes()) 
        $toolbar->setModes($modes);
    

之前:

// set collection to toolbar and apply sort

我们还在 new.php 中为新产品页面添加了相同的逻辑,以便过滤掉不应该显示的产品。

布拉德

【讨论】:

【参考方案3】:

我知道在表示层添加业务逻辑不是一个好习惯,但无论如何都是一种快速的方法来限制 app\design\frontend\iln\default\template\catalog\product\list.php 中的产品列表

<?php $_selling_type = $_product->getResource()->getAttribute('selling_type')->getFrontend()->getValue($_product); ?>

if ($_selling_type == 'No Price') 

  echo ('what ever you want');

【讨论】:

以上是关于从 list.phtml 结果中排除产品(magento)的主要内容,如果未能解决你的问题,请参考以下文章

搜索页面上 list.phtml 中非对象的 getId()

从 Woocommerce 相关产品中排除特定产品类别

从 WooCommerce 中的相关产品中排除产品类别

从产品类别中排除最近查看的产品小部件中的 Woocommerce 产品

将寻呼机放在顶部和底部

从 WooCommerce 优惠券中排除具有特定属性条款的产品