我想在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的加载最低价格类别产品上市?
Answer 1:
我看着有点深入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()
);
这可能不是完美的解决方案,但它的工作,它做它干净了一点比遍历所有子产品,并找到最低价格的方式。
Answer 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
,你会得到你的产品集合,然后使用Subsurf的代码在顶部foreach()
其重复。
$_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!
Answer 3:
还有另一种方式,将仍然允许您使用$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);
?>
Answer 4:
以下是卓有成效的,而无需使用一个产品集合:
$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
和由适合于一个单一的产品。
文章来源: Magento: How to retrieve the minimal price of (i.e.) grouped products?