Вызов getMinimalPrice() для одного объекта продукта с ценами уровня


Я хочу отображать минимальную цену уровня на странице моего продукта и везде, где я загружаю свою модель продукта. Я использую базовую функцию для получения данных о ценах:

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

Когда это вызывается в коллекции продуктов (например, на странице категории), это работает нормально. Когда я вызываю getPriceHtml для экземпляра модели продукта (загруженного с Mage::getModel('catalog/product')->load($id), если я дамп данных продукта, то getData('minimal_price') не существует.

Я думаю, что при загрузке коллекции

 ->addMinimalPrice()

Добавляется в коллекция, но это отсутствует в загрузке одного объекта. Поэтому мой вопрос в том, нужно ли мне включать какой-либо другой метод/помощник/модель при загрузке продукта, чтобы также была загружена минимальная цена?

Author: Fabian Schmengler, 2013-10-30

2 answers

Я не нашел простого способа загрузить индекс для одного продукта, безопаснее всего использовать коллекцию.

Этот вспомогательный метод сработал для меня:

/**
 * Loads minimal price from index in single product entity
 *
 * @param Mage_Catalog_Model_Product $product
 * @return $this
 */
public function loadPriceIndex(Mage_Catalog_Model_Product $product)
{
    $productCollection = $product->getCollection();
    $productCollection->addAttributeToSelect([])
        ->addAttributeToFilter('entity_id', $product->getId())
        ->addPriceData();
    $product->addData($productCollection->getFirstItem()->getData());
    return $this;
}

Не беспокойтесь о загрузке базы данных, это приведет к одному запросу только с одним соединением в таблице индекса цен, например:

SELECT `e`.*, price_index.price AS `indexed_price`, `price_index`.`price`, `price_index`.`final_price`,
    IF(`price_index`.`tier_price`,
        LEAST(`price_index`.`min_price`, `price_index`.`tier_price`), 
        `price_index`.`min_price`
    ) AS `minimal_price`,
    `price_index`.`min_price`, `price_index`.`max_price`, `price_index`.`tier_price`
FROM `catalog_product_entity` AS `e`
INNER JOIN `catalog_product_index_price` AS `price_index`
ON price_index.entity_id = e.entity_id
    AND price_index.website_id = '5'
    AND price_index.customer_group_id = 0
WHERE (`e`.`entity_id` = '2026') 
 5
Author: Fabian Schmengler, 2015-02-05 10:42:40

Похоже, что метод getMinimalPrice() существует только для вызова индексированного значения. Метод относится к этому классу:

Mage_catalogindex_model_ресурс_дата_группированный

Поэтому получить это для одного экземпляра продукта невозможно, так как таблица индексов не используется. Однако можно выполнить эту работу, выведя цены уровня (в виде массива) и вернув цену последнего уровня, которая должна быть вашей самой дешевой. Вот так:

$tier_price = end($_product->getTierPrice());
echo $tier_price['price'];
 2
Author: Adam Moss, 2014-02-19 16:08:44