Получите самую низкую и самую высокую возможную цену за настраиваемый продукт
Какой был бы хороший способ получить самые низкие и самые высокие возможные цены на данный настраиваемый продукт - на основе его доступных опций?
Например, футболка поставляется в следующих размерах и ценах:
Small - $10
Medium - $20
Large - $30
Я хочу получить массив примерно так:
array(10, 30)
Моя лучшая идея на данный момент - загрузить экземпляр настраиваемого типа продукта и использовать getUsedProducts
, затем создать массив цен, отсортировать и нарезать.
Это должно сработать, однако для этого необходимо запускаться в шаблоне списка продуктов, поэтому он должен быть полуэффективным.
Кто-нибудь еще сталкивался с этой проблемой раньше?
РЕДАКТИРОВАТЬ - это не сработает, так как мне нужно настраиваемое значение цены, т.Е. добавочная цена, которую magento ставит поверх настраиваемой цены продукта
6 answers
Попробуйте этот подход. используйте массив конфигурации, который раскрывающиеся списки атрибутов используют для изменения цены настраиваемого продукта. Давайте предположим, что $productId
- это идентификатор настраиваемого продукта.
$product = Mage::getModel('catalog/product')->load($productId);
$block = Mage::app()->getLayout()->createBlock('catalog/product_view_type_configurable');
$block->setProduct($product);
$config = json_decode($block->getJsonConfig(), true);
$basePrice = $config['basePrice'];
$min = null;
$max = null;
foreach ($config['attributes'] as $aId=>$aValues){
foreach ($aValues['options'] as $key=>$value){
if (is_null($min) || $min>$value['price']){
$min = $value['price'];
}
if (is_null($max) || $max<$value['price']){
$max = $value['price'];
}
}
}
//until here we have the min and max price differences. Now just add the base price.
$min += $basePrice;
$max += $basePrice;
Более простой вариант.
if($_product->isConfigurable()) // check if the product is configurable (u may check this in for loop of products)
{
//get associative (child) products
$childProducts = Mage::getModel('catalog/product_type_configurable')->getUsedProducts(null,$_product);
$childPriceLowest = "";
$childPriceHighest = "";
foreach($childProducts as $child){
$_child = Mage::getModel('catalog/product')->load($child->getId());
if($childPriceLowest == '' || $childPriceLowest > $_child->getPrice() )
$childPriceLowest = $_child->getPrice();
if($childPriceHighest == '' || $childPriceHighest < $_child->getPrice() )
$childPriceHighest = $_child->getPrice();
}
$price_array = array($childPriceLowest,$childPriceHighest); // array containing required values
}
Этот ответ, также @Marius, на аналогичный вопрос является хорошей основой для работы. Используя это, вот решение этой проблемы, которое учитывает потенциал настраиваемых продуктов, имеющих несколько атрибутов, которые изменяют цену.
Я написал это как функцию, которая принимает настраиваемый идентификатор продукта и возвращает строку от минимальной до максимальной цены. Должно быть довольно ясно, как использовать это в нужном вам контексте.
function getPriceRange($productId) {
$max = '';
$min = '';
$pricesByAttributeValues = array();
$product = Mage::getModel('catalog/product')->load($productId);
$attributes = $product->getTypeInstance(true)->getConfigurableAttributes($product);
$basePrice = $product->getFinalPrice();
foreach ($attributes as $attribute){
$prices = $attribute->getPrices();
foreach ($prices as $price){
if ($price['is_percent']){ //if the price is specified in percents
$pricesByAttributeValues[$price['value_index']] = (float)$price['pricing_value'] * $basePrice / 100;
}
else { //if the price is absolute value
$pricesByAttributeValues[$price['value_index']] = (float)$price['pricing_value'];
}
}
}
$simple = $product->getTypeInstance()->getUsedProducts();
foreach ($simple as $sProduct){
$totalPrice = $basePrice;
foreach ($attributes as $attribute){
$value = $sProduct->getData($attribute->getProductAttribute()->getAttributeCode());
if (isset($pricesByAttributeValues[$value])){
$totalPrice += $pricesByAttributeValues[$value];
}
}
if(!$max || $totalPrice > $max)
$max = $totalPrice;
if(!$min || $totalPrice < $min)
$min = $totalPrice;
}
return "$min - $max";
}
Это поможет, хотя это не лучший пример
<?php $_configurable = $_product->getTypeInstance()->getUsedProductIds(); ?>
<?php $price_array = array(); $i=0; ?>
<?php foreach ($_configurable as $_config): ?>
<?php $_simpleproduct = Mage::getModel('catalog/product')->load($_config); ?>
<?php array_push($price_array, $_simpleproduct->getPrice()); ?>
<?php $i++; endforeach; ?>
<?php if(min($price_array) != max($price_array)): ?>
<div class="price-box">
<span id="product-price-<?php echo $_product->getId(); ?>" class="regular-price">
<?php echo Mage::helper('core')->currency(min($price_array)); ?>
<span class="price" style="padding: 0 5px; color: black;">-</span>
<span class="final"><?php echo Mage::helper('core')->currency(max($price_array)); ?></span>
</span>
</div>
<?php else: ?>
<?php echo $this->getPriceHtml($_product, true); ?>
<?php endif; ?>
Используя EE 1.14, я по какой-то причине получал "забавные" числа, используя методы, предложенные выше. $childPriceLowest
и $childPriceHighest
не всегда возвращали истинные минимальные и максимальные значения. Иногда с несколькими вариантами конфигурации и т. Д. Я видел промежуточные значения.
В итоге я использовал это:
//get associated (child) products
$childProducts = Mage::getModel('catalog/product_type_configurable')
->getUsedProducts(null,$_product);
//cycle through child products, dump prices in an array....
foreach($childProducts as $child){
$_child = Mage::getModel('catalog/product')->load($child->getId());
$childPrices[] = $_child->getPrice();
}
// concentrate the array to unique values and sort ascending....
$childPrices = array_unique($childPrices, SORT_NUMERIC);
sort($childPrices); // array containing required values
Затем позже это повторит диапазон:
<?php echo Mage::helper('core')->currency( $childPrices[0], true, false); ?>
<span class="config-price-divider"> - </span>
<?php echo Mage::helper('core')->currency( end($childPrices), true, false)?>
(например,. "$10.00 - $30.00")
Вы также можете попробовать этот простой код, чтобы получить самую высокую/низкую цену в соответствии с вашими потребностями
$childPriceHighest = '';
$product = Mage::getModel('catalog/product')->load($productId);
$childProducts = Mage::getSingleton('catalog/product_type_configurable')->getUsedProducts( null, $product );
if ($childProducts) {
foreach ($childProducts as $child) {
$_child = Mage::getSingleton('catalog/product')->load($child->getId());
if ($childPriceHighest == '' || $childPriceHighest < $_child->getPrice()) {
$childPriceHighest = $_child->getPrice();
}
}
} else {
$childPriceHighest = $product->getPrice();
}
return $childPriceHighest;