5

我正在尝试在 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

4 回答 4

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()
);

这可能不是完美的解决方案,但它完成了这项工作,而且它比迭代所有子产品并以这种方式找到最低价格要干净一些。

于 2012-08-25T08:42:06.057 回答
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()因此没有为我做任何事情。我猜如果有一套,可能会有一个得到,所以$_product=$this->getProduct()我的模板需要的魔法price.phtml才能正常工作。然后我注意到我可以直接将Mage::in分配setProduct()$_product.

谢谢,子冲浪!!!

于 2013-02-25T04:49:26.280 回答
0

还有另一种方法仍然允许您$this->getPriceHtml($_product, true);在模板中使用,然后处理所有复杂的价格显示规则并将“起始于”放在分组产品价格之前。

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

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);
?>
于 2014-10-06T02:24:15.390 回答
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并适用于单个产品。

于 2017-10-01T00:21:07.963 回答