Magento:如何检索(即)分组产品的最低价格?

时间:2012-08-21 11:47:33

标签: magento

我正在尝试在Magento 1.7.0.2的产品视图页面上显示分组产品的价格,就像它显示在类别产品列表中一样(“起始于:xx.xx”)。我以为我可以使用

$this->getPriceHtml($_product, true);

要这样做,因为它在类别产品列表中的工作方式相同,但是作为我在Magento中尝试做的所有事情,它并不那么容易,因为该方法不会在产品视图页面上返回任何内容。

我更深入地了解了Magento的代码,并发现问题的原因是产品视图页面上没有设置产品的最低价格数据($ _product-> getMinimalPrice()返回null)。

因此,我做了一些关于如何加载产品最低价格的研究,这提出了像

这样的想法
$_product->getPriceModel()->getMinimalPrice($_product);

这不起作用,因为显然该方法已被弃用并在最后一次更新或

中删除
$priceModel = Mage::getResourceModel('catalogindex/price');
$priceModel->setStoreId(Mage::app()->getStore()->getId());
$priceModel->setCustomerGroupId(Mage::getSingleton('customer/session')->getCustomerGroupId());

$minimalPrices = $priceModel->getMinimalPrices(array($_product->getId()));
$minimalPrice = $minimalPrices[0];
$_product->setData('minimal_price', $minimalPrice['value']);
$_product->setData('minimal_tax_class_id', $minimalPrice['tax_class_id']);

不起作用,因为表'catalogindex_minimal_price'为空。

所以我的问题是,Magento如何在类别产品列表中加载最低价格?

4 个答案:

答案 0 :(得分:9)

我更深入地了解了Magento的代码,并追踪了Magento如何加载产品列表的产品。 查看产品列表时,产品集合由模型Mage_Catalog_Model_Layer加载,它通过向集合的SQL添加连接,将最小的价格和其他内容添加到集合中的产品,但我还没有找到同样的模型单品而不是收藏品。

因为我不想使用直接SQL查询,所以我检查了CatalogIndex模块,但该模块似乎根本不起作用,因为它的所有索引表都是空的甚至已损坏。

$data_grouped = Mage::getModel("catalogindex/data_grouped");
$minimal = $data_grouped->getMinimalPrice(array($_product->getId()), Mage::app()->getStore());

起初看起来不错,但它给了我以下错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'catalog_product_index_price.value' in 'field list'

CatalogIndex模块已被弃用,或者我太愚蠢而无法启用它。

但是,我现在在price.phtml模板中创建了一个解决方法,它使用相同的方法检索产品列表的最小价格和税率: 在模板的开头,我添加了以下内容:

$this->setProduct(
    Mage::getModel("catalog/product")->getCollection()
        ->addAttributeToSelect(Mage::getSingleton("catalog/config")->getProductAttributes())
        ->addAttributeToFilter("entity_id", $this->getProduct()->getId())
        ->setPage(1, 1)
        ->addMinimalPrice()
        ->addFinalPrice()
        ->addTaxPercents()
        ->load()
        ->getFirstItem()
);

这可能不是一个完美的解决方案,但是它可以完成这项工作,它比迭代所有儿童产品并找到最低价格更清洁。

答案 1 :(得分:2)

对于Subsurf的回答,这不是一个大的HTML评论。如果您正在阅读本文,则可能正在实施自己的自定义模块以显示产品列表。就我而言,它只是批发商的单页。我的目标是获得我自己公司产品的清单,并给他们一个列表,就像它是另一个类别。我将模板的list.phtml复制到了我的新content.phtml。但getMinimalPrice()正在返回NULL,这意味着当此代码调用getPriceHtml()时,price.phtml未显示批发价格。

我做了一个带索引控制器和content.phtml的简单模块。使用样板我在网上看到indexController.php文件中的更改:

$block = $this->getLayout()->createBlock(
    'Mage_Core_Block_Template',
    'b2b',
    array('template' => 'b2b/content.phtml')
);

为:

$block = $this->getLayout()->createBlock(
    'Mage_Catalog_Block_Product_List',
    'b2b',
    array('template' => 'b2b/content.phtml')
);

这对您来说非常重要,可以正确显示产品列表。


现在,在模板文件中,在我的案例content.phtml中,您获得了产品集合,然后使用重复的foreach()顶部的Subsurf代码。

    $_productCollection = Mage::getModel('catalog/product')
        ->getCollection()
//          ->addAttributeToSelect('*')
// doesn't work     ->addAttributeToSelect('special_price')
        ->addAttributeToSelect('sku')
        ->addAttributeToFilter('status', 1)
        ->addAttributeToFilter('visibility', 4)
        // http://stackoverflow.com/questions/1332742/magento-retrieve-products-with-a-specific-attribute-value
        ->addFieldToFilter( array(
                array('attribute'=>'manufacturer','eq'=>'143')
                , array('attribute'=>'manufacturer','eq'=>'139')
            ))
        ;

echo "<p>There are ".count($_productCollection)." products: </p>";
echo '<div class="category-products">';
// List mode 
if($this->getMode()!='grid') { 
    $_iterator = 0;
    echo'<ol class="products-list" id="products-list">';
    foreach ($_productCollection as $_product) {
        ?>          <li class="item<?php if( ++$_iterator == sizeof($_productCollection) ): ?> last<?php endif; ?>">
        <?php 
        $_product=Mage::getModel("catalog/product")->getCollection()
            ->addAttributeToSelect(Mage::getSingleton("catalog/config")->getProductAttributes())
            ->addAttributeToFilter("entity_id", $_product->getId())
            ->setPage(1, 1)
            ->addMinimalPrice()
            ->addFinalPrice()
            ->addTaxPercents()
            ->load()
            ->getFirstItem()
            );
        echo "Minimal price: ".$_product->getMinimalPrice()."<br>\n";       

由于这不是单个产品的页面而且我正在使用其他模板代码,$this->setProduct()没有为我做任何事情。我猜测是否有一个集合,可能会有一个get,所以$_product=$this->getProduct()是我的模板price.phtml需要正常工作的魔法。然后我注意到我可以直接将Mage:: setProduct()分配给$_product

谢谢,Subsurf !!!

答案 2 :(得分:0)

还有另一种方法可以让您在模板中使用$this->getPriceHtml($_product, true);,然后处理所有复杂的价格显示规则并放置&#34;从&#34;开始在分组产品价格之前。

我将其用于自定义特色产品块。在块类中,我有这个功能:

class MyCompany_Catalog_Block_Product_Featured extends Mage_Catalog_Block_Product_Abstract {
  public function setGroupedProductPrice($group_product) {
   $prices = array();
   foreach ($group_product->getTypeInstance()->getChildrenIds($group_product->getId()) as $ids) {
     foreach ($ids as $id) {
       $product = Mage::getModel('catalog/product')->load($id);
       $prices[] = $product->getPriceModel()->getPrice($product);
     }
   }
   ksort($prices);
   $group_product->setPrice(array_pop($prices));
  }
}

然后在模板中:

<?php 
  if ($_product->getTypeId() == 'grouped')
    $this->prepareGroupedProduct($_product);
  echo $this->getPriceHtml($_product, true);
?>

答案 3 :(得分:0)

以下是不使用产品系列的技巧:

$priceResource = Mage::getResourceSingleton('catalogindex/price');

$select = $priceResource->getReadConnection()->select();
$select->from(
    array('price_table' => $priceResource->getMainTable())
)
    ->where('price_table.entity_id = ?', $_product->getId())
    ->where('price_table.website_id = ?', Mage::app()->getStore()->getWebsiteId())
    ->where('price_table.customer_group_id = ?', Mage::getSingleton('customer/session')->getCustomerGroupId());

$result = $priceResource->getReadConnection()->fetchRow($select);

此代码改编自\Mage_CatalogIndex_Model_Resource_Price::getMinimalPrices,适用于单个产品。