我正在尝试在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如何在类别产品列表中加载最低价格?
答案 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
,适用于单个产品。