5

グループ化された製品の価格を、カテゴリ製品リスト(「開始:xx.xx」)に表示されているのと同じように、Magento1.7.0.2の製品ビューページに表示しようとしています。ただ使えると思った

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

これは、カテゴリの製品リストでも同じように機能するためですが、Magentoでやろうとしたすべてのことと同様に、そのメソッドは製品ビューページに何も返さないため、それほど簡単ではありません。

Magentoのコードをもう少し詳しく調べたところ、この問題の原因は、製品の最小価格データが製品ビューページに設定されていないことがわかりました($ _product-> getMinimalPrice()はnullを返します)。

そのため、製品の最低価格をロードする方法について調査し、次のようなアイデアを生み出しました。

$_product->getPriceModel()->getMinimalPrice($_product);

このメソッドは、最後の更新の1つで非推奨になり、削除されたため、または

$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は、製品コレクションを取得してから、繰り返しの上部にある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::次に、 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 に答える