Вызов getMinimalPrice() для одного объекта продукта с ценами уровня
Я хочу отображать минимальную цену уровня на странице моего продукта и везде, где я загружаю свою модель продукта. Я использую базовую функцию для получения данных о ценах:
$this->getPriceHtml($product, true);
Когда это вызывается в коллекции продуктов (например, на странице категории), это работает нормально. Когда я вызываю getPriceHtml для экземпляра модели продукта (загруженного с Mage::getModel('catalog/product')->load($id)
, если я дамп данных продукта, то getData('minimal_price')
не существует.
Я думаю, что при загрузке коллекции
->addMinimalPrice()
Добавляется в коллекция, но это отсутствует в загрузке одного объекта. Поэтому мой вопрос в том, нужно ли мне включать какой-либо другой метод/помощник/модель при загрузке продукта, чтобы также была загружена минимальная цена?
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')
Похоже, что метод getMinimalPrice() существует только для вызова индексированного значения. Метод относится к этому классу:
Mage_catalogindex_model_ресурс_дата_группированный
Поэтому получить это для одного экземпляра продукта невозможно, так как таблица индексов не используется. Однако можно выполнить эту работу, выведя цены уровня (в виде массива) и вернув цену последнего уровня, которая должна быть вашей самой дешевой. Вот так:
$tier_price = end($_product->getTierPrice());
echo $tier_price['price'];