Magento的:如何获取最低的价格(即)分组的产品?(Magento: How to retrie

2019-09-21 10:32发布

我想在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?
标签: magento