Специальная цена наименьшей продажи должна отображаться на настраиваемой странице просмотра продукта
Пожалуйста, посетите этот настраиваемый продукт ссылка
Вы можете видеть: MRP : Rs. 9.00, below that Rs. 0.00
по умолчанию
Внутренние значения: Цена: 0, специальная цена : 0
В той же ссылке выше вы можете увидеть раскрывающийся атрибут "цвет", пожалуйста, выберите
1)Blue, = > MRP: Rs. 10.00, below that Rs 5.00
2)Light Pink => MRP: Rs. 9.00 below that Rs 4.00
3)choose an option => MRP: Rs. 9.00 ,below that 4.00
Теперь вариант 3 работает нормально. но как только вы обновите страницу , она покажет исходное значение, введенное в бэкэнд по специальной цене
Как работает цена :
Наименьшая цена простого товара отображается после обновления страницы. Это прекрасно.
Как работает специальная цена
Значение, введенное в серверной части, отображается после обновления страницы. Это неверно.
Что мне нужно, так это :
Наименьшая специальная цена простого продукта должна отображаться после обновления страницы
Я перешел по этой ссылке, ответ @alan для отображения наименьшей цены продажи простых продуктов: Magento Настраиваемая Цена Продукта, Переопределяющая Простую Цену Продукта
<?php
#The methods in there have become a bit convoluted, so it could benefit from a tidy,
#...though the logic is not that simple any more.
class OrganicInternet_SimpleConfigurableProducts_Catalog_Model_Product_Type_Configurable_Price
extends Mage_Catalog_Model_Product_Type_Configurable_Price
{
#We don't want to show a separate 'minimal' price for configurable products.
public function getMinimalPrice($product)
{
return $this->getPrice($product);
}
public function getMaxPossibleFinalPrice($product) {
#Indexer calculates max_price, so if this value's been loaded, use it
$price = $product->getMaxPrice();
if ($price !== null) {
return $price;
}
$childProduct = $this->getChildProductWithHighestPrice($product, "finalPrice");
#If there aren't any salable child products we return the highest price
#of all child products, including any ones not currently salable.
if (!$childProduct) {
$childProduct = $this->getChildProductWithHighestPrice($product, "finalPrice", false);
}
if ($childProduct) {
return $childProduct->getFinalPrice();
}
return false;
}
#If there aren't any salable child products we return the lowest price
#of all child products, including any ones not currently salable.
public function getFinalPrice($qty=null, $product)
{
//Start edit
$selectedAttributes = array();
if ($product->getCustomOption('attributes')) {
$selectedAttributes = unserialize($product->getCustomOption('attributes')->getValue());
}
//End edit
if (sizeof($selectedAttributes)) return $this->getSimpleProductPrice($qty, $product);
if (is_null($qty) && !is_null($product->getCalculatedFinalPrice())) {
return $product->getCalculatedFinalPrice();
}
$basePrice = $this->getBasePrice($product, $qty);
$finalPrice = $basePrice;
$product->setFinalPrice($finalPrice);
Mage::dispatchEvent('catalog_product_get_final_price', array('product' => $product, 'qty' => $qty));
$finalPrice = $product->getData('final_price');
$finalPrice += $this->getTotalConfigurableItemsPrice($product, $finalPrice);
$finalPrice += $this->_applyOptionsPrice($product, $qty, $basePrice) - $basePrice;
$finalPrice = max(0, $finalPrice);
$product->setFinalPrice($finalPrice);
return $finalPrice;
}
public function getSimpleProductPrice($qty=null, $product)
{
$cfgId = $product->getId();
$product->getTypeInstance(true)
->setStoreFilter($product->getStore(), $product);
$attributes = $product->getTypeInstance(true)
->getConfigurableAttributes($product);
$selectedAttributes = array();
if ($product->getCustomOption('attributes')) {
$selectedAttributes = unserialize($product->getCustomOption('attributes')->getValue());
}
$db = Mage::getSingleton('core/resource')->getConnection('core_read');
$dbMeta = Mage::getSingleton('core/resource');
$sql = <<<SQL
SELECT main_table.entity_id FROM {$dbMeta->getTableName('catalog/product')} `main_table` INNER JOIN
{$dbMeta->getTableName('catalog/product_super_link')} `sl` ON sl.parent_id = {$cfgId}
SQL;
foreach($selectedAttributes as $attributeId => $optionId) {
$alias = "a{$attributeId}";
$sql .= ' INNER JOIN ' . $dbMeta->getTableName('catalog/product') . "_int" . " $alias ON $alias.entity_id = main_table.entity_id AND $alias.attribute_id = $attributeId AND $alias.value = $optionId AND $alias.entity_id = sl.product_id";
}
$id = $db->fetchOne($sql);
return Mage::getModel("catalog/product")->load($id)->getFinalPrice($qty);
}
public function getPrice($product)
{
#Just return indexed_price, if it's been fetched already
#(which it will have been for collections, but not on product page)
$price = $product->getIndexedPrice();
if ($price !== null) {
return $price;
}
$childProduct = $this->getChildProductWithLowestPrice($product, "finalPrice");
#If there aren't any salable child products we return the lowest price
#of all child products, including any ones not currently salable.
if (!$childProduct) {
$childProduct = $this->getChildProductWithLowestPrice($product, "finalPrice", false);
}
if ($childProduct) {
return $childProduct->getPrice();
}
return false;
}
public function getChildProducts($product, $checkSalable=true)
{
static $childrenCache = array();
$cacheKey = $product->getId() . ':' . $checkSalable;
if (isset($childrenCache[$cacheKey])) {
return $childrenCache[$cacheKey];
}
$childProducts = $product->getTypeInstance(true)->getUsedProductCollection($product);
$childProducts->addAttributeToSelect(array('price', 'special_price', 'status', 'special_from_date', 'special_to_date'));
if ($checkSalable) {
$salableChildProducts = array();
foreach($childProducts as $childProduct) {
if($childProduct->isSalable()) {
$salableChildProducts[] = $childProduct;
}
}
$childProducts = $salableChildProducts;
}
$childrenCache[$cacheKey] = $childProducts;
return $childProducts;
}
/*
public function getLowestChildPrice($product, $priceType, $checkSalable=true)
{
$childProduct = $this->getChildProductWithLowestPrice($product, $priceType, $checkSalable);
if ($childProduct) {
if ($priceType == "finalPrice") {
$childPrice = $childProduct->getFinalPrice();
} else {
$childPrice = $childProduct->getPrice();
}
} else {
$childPrice = false;
}
return $childPrice;
}
*/
#Could no doubt add highest/lowest as param to save 2 near-identical functions
public function getChildProductWithHighestPrice($product, $priceType, $checkSalable=true)
{
$childProducts = $this->getChildProducts($product, $checkSalable);
if (count($childProducts) == 0) { #If config product has no children
return false;
}
$maxPrice = 0;
$maxProd = false;
foreach($childProducts as $childProduct) {
if ($priceType == "finalPrice") {
$thisPrice = $childProduct->getFinalPrice();
} else {
$thisPrice = $childProduct->getPrice();
}
if($thisPrice > $maxPrice) {
$maxPrice = $thisPrice;
$maxProd = $childProduct;
}
}
return $maxProd;
}
public function getChildProductWithLowestPrice($product, $priceType, $checkSalable=true)
{
$childProducts = $this->getChildProducts($product, $checkSalable);
if (count($childProducts) == 0) { #If config product has no children
return false;
}
$minPrice = PHP_INT_MAX;
$minProd = false;
foreach($childProducts as $childProduct) {
if ($priceType == "finalPrice") {
$thisPrice = $childProduct->getFinalPrice();
} else {
$thisPrice = $childProduct->getPrice();
}
if($thisPrice < $minPrice) {
$minPrice = $thisPrice;
$minProd = $childProduct;
}
}
return $minProd;
}
//Force tier pricing to be empty for configurable products:
public function getTierPrice($qty=null, $product)
{
return array();
}
}
3 answers
Когда вы создаете настраиваемый продукт, не имеет значения, какова цена простых продуктов - эти цены полностью игнорируются. Поэтому, если вы хотите продать простой продукт A по цене 29,99 доллара и простой продукт B (39,99 доллара), вам необходимо создать настраиваемый продукт, установить его цену в 29,99 доллара и открыть вкладку Связанный продукт. Добавьте продукты, которые вы хотите связать с этим настраиваемым продуктом. После их добавления появляется блок с именем Конфигурация атрибутов суперпродукта, который содержит варианты и различия в ценах. Оставьте цену продукта A пустой и поместите 10 (+10 долларов США) в поле цена продукта B и вуаля: разные простые продукты имеют разную цену.
На самом деле существует расширение, которое позволяет использовать простые цены на продукты вместо разницы в ценах, но его довольно сложно настроить. Поскольку это бесплатное расширение, я надеюсь, что никто не будет жаловаться на то, что я вставил его ссылку здесь:
Https://github.com/organicinternet/magento-configurable-simple
ИЛИ
Попробуйте это, если ваша проблема решена
<?php
if($_product->getTypeId() == "configurable"):
$conf = Mage::getModel('catalog/product_type_configurable')->setProduct($_product);
$simple_collection = $conf->getUsedProductCollection()->addAttributeToSelect('*')->addFilterByRequiredOptions();
foreach($simple_collection as $simple_product){
echo $simple_product->getSku() . " - " . $simple_product->getName() . " - " . Mage::helper('core')->currency($simple_product->getPrice()) . "<br>";
}
endif;
Это можно сделать, но для этого потребуется много модов, ради обсуждения я обращусь непосредственно к "основному" коду и предоставлю вам возможность создать собственный модуль.
На странице сведений о продукте информация о цене дочернего продукта хранится в объекте javascript, называемом optionPrice
var optionsPrice = new Product.OptionsPrice( .....
Этот объект был записан на страницу с помощью следующего файла дизайна дизайн/интерфейс/база/по умолчанию/шаблон/каталог/продукт/представление.phtml:
var optionsPrice = new Product.OptionsPrice(<?php echo $this->getJsonConfig() ?>);
Информация, записанная в Объект optionsPrice используется в configurable.js что в функции "Перезагрузить цену" обновите страницу, написав соответствующую информацию о цене.
Для того, чтобы также отобразить специальную цену, я предлагаю следующее:
1) Добавьте в Optionsprice специальную информацию о цене, модифицирующую функцию getJsonConfig.
2) Изменить configurable.js файл для обновления страницы.
В configurable.js файл ссылается на "прайс-клон", который является копией продублированного ценового поля на странице настраиваемого продукта...
Я надеюсь направить вас в правильном направлении для развития!
<?php
#The methods in there have become a bit convoluted, so it could benefit from a tidy,
#...though the logic is not that simple any more.
class OrganicInternet_SimpleConfigurableProducts_Catalog_Model_Product_Type_Configurable_Price
extends Mage_Catalog_Model_Product_Type_Configurable_Price
{
#We don't want to show a separate 'minimal' price for configurable products.
public function getMinimalPrice($product)
{
return $this->getPrice($product);
}
public function getMaxPossibleFinalPrice($product) {
#Indexer calculates max_price, so if this value's been loaded, use it
$price = $product->getMaxPrice();
if ($price !== null) {
return $price;
}
$childProduct = $this->getChildProductWithHighestPrice($product, "finalPrice");
#If there aren't any salable child products we return the highest price
#of all child products, including any ones not currently salable.
if (!$childProduct) {
$childProduct = $this->getChildProductWithHighestPrice($product, "finalPrice", false);
}
if ($childProduct) {
return $childProduct->getFinalPrice();
}
return false;
}
#If there aren't any salable child products we return the lowest price
#of all child products, including any ones not currently salable.
public function getFinalPrice($qty=null, $product)
{
//Start edit
$selectedAttributes = array();
if ($product->getCustomOption('attributes')) {
$selectedAttributes = unserialize($product->getCustomOption('attributes')->getValue());
}
//End edit
if (sizeof($selectedAttributes)) return $this->getSimpleProductPrice($qty, $product);
if (is_null($qty) && !is_null($product->getCalculatedFinalPrice())) {
return $product->getCalculatedFinalPrice();
}
$basePrice = $this->getBasePrice($product, $qty);
$finalPrice = $basePrice;
$product->setFinalPrice($finalPrice);
Mage::dispatchEvent('catalog_product_get_final_price', array('product' => $product, 'qty' => $qty));
$finalPrice = $product->getData('final_price');
$finalPrice += $this->getTotalConfigurableItemsPrice($product, $finalPrice);
$finalPrice += $this->_applyOptionsPrice($product, $qty, $basePrice) - $basePrice;
$finalPrice = max(0, $finalPrice);
$product->setFinalPrice($finalPrice);
return $finalPrice;
}
public function getSimpleProductPrice($qty=null, $product)
{
$cfgId = $product->getId();
$product->getTypeInstance(true)
->setStoreFilter($product->getStore(), $product);
$attributes = $product->getTypeInstance(true)
->getConfigurableAttributes($product);
$selectedAttributes = array();
if ($product->getCustomOption('attributes')) {
$selectedAttributes = unserialize($product->getCustomOption('attributes')->getValue());
}
$db = Mage::getSingleton('core/resource')->getConnection('core_read');
$dbMeta = Mage::getSingleton('core/resource');
$sql = <<<SQL
SELECT main_table.entity_id FROM {$dbMeta->getTableName('catalog/product')} `main_table` INNER JOIN
{$dbMeta->getTableName('catalog/product_super_link')} `sl` ON sl.parent_id = {$cfgId}
SQL;
foreach($selectedAttributes as $attributeId => $optionId) {
$alias = "a{$attributeId}";
$sql .= ' INNER JOIN ' . $dbMeta->getTableName('catalog/product') . "_int" . " $alias ON $alias.entity_id = main_table.entity_id AND $alias.attribute_id = $attributeId AND $alias.value = $optionId AND $alias.entity_id = sl.product_id";
}
$id = $db->fetchOne($sql);
return Mage::getModel("catalog/product")->load($id)->getFinalPrice($qty);
}
public function getPrice($product)
{
#Just return indexed_price, if it's been fetched already
#(which it will have been for collections, but not on product page)
$price = $product->getIndexedPrice();
if ($price !== null) {
return $price;
}
$childProduct = $this->getChildProductWithLowestPrice($product, "finalPrice");
#If there aren't any salable child products we return the lowest price
#of all child products, including any ones not currently salable.
if (!$childProduct) {
$childProduct = $this->getChildProductWithLowestPrice($product, "finalPrice", false);
}
if ($childProduct) {
return $childProduct->getPrice();
}
return false;
}
public function getChildProducts($product, $checkSalable=true)
{
static $childrenCache = array();
$cacheKey = $product->getId() . ':' . $checkSalable;
if (isset($childrenCache[$cacheKey])) {
return $childrenCache[$cacheKey];
}
$childProducts = $product->getTypeInstance(true)->getUsedProductCollection($product);
$childProducts->addAttributeToSelect(array('price', 'special_price', 'status', 'special_from_date', 'special_to_date'));
if ($checkSalable) {
$salableChildProducts = array();
foreach($childProducts as $childProduct) {
if($childProduct->isSalable()) {
$salableChildProducts[] = $childProduct;
}
}
$childProducts = $salableChildProducts;
}
$childrenCache[$cacheKey] = $childProducts;
return $childProducts;
}
/*
public function getLowestChildPrice($product, $priceType, $checkSalable=true)
{
$childProduct = $this->getChildProductWithLowestPrice($product, $priceType, $checkSalable);
if ($childProduct) {
if ($priceType == "finalPrice") {
$childPrice = $childProduct->getFinalPrice();
} else {
$childPrice = $childProduct->getPrice();
}
} else {
$childPrice = false;
}
return $childPrice;
}
*/
#Could no doubt add highest/lowest as param to save 2 near-identical functions
public function getChildProductWithHighestPrice($product, $priceType, $checkSalable=true)
{
$childProducts = $this->getChildProducts($product, $checkSalable);
if (count($childProducts) == 0) { #If config product has no children
return false;
}
$maxPrice = 0;
$maxProd = false;
foreach($childProducts as $childProduct) {
if ($priceType == "finalPrice") {
$thisPrice = $childProduct->getFinalPrice();
} else {
$thisPrice = $childProduct->getPrice();
}
if($thisPrice > $maxPrice) {
$maxPrice = $thisPrice;
$maxProd = $childProduct;
}
}
return $maxProd;
}
public function getChildProductWithLowestPrice($product, $priceType, $checkSalable=true)
{
$childProducts = $this->getChildProducts($product, $checkSalable);
if (count($childProducts) == 0) { #If config product has no children
return false;
}
$minPrice = PHP_INT_MAX;
$minProd = false;
foreach($childProducts as $childProduct) {
if ($priceType == "finalPrice") {
$thisPrice = $childProduct->getFinalPrice();
} else {
$thisPrice = $childProduct->getPrice();
}
if($thisPrice < $minPrice) {
$minPrice = $thisPrice;
$minProd = $childProduct;
}
}
return $minProd;
}
public function getChildProductWithLowestSpecialPrice($product, $priceType, $checkSalable=true)
{
$childProducts = $this->getChildProducts($product, $checkSalable);
if (count($childProducts) == 0) { #If config product has no children
return false;
}
$minPrice = PHP_INT_MAX;
$minProd = false;
foreach($childProducts as $childProduct) {
if ($priceType == "finalPrice") {
$thisPrice = $childProduct->getFinalPrice();
} else {
$thisPrice = $childProduct->getPrice();
}
if($thisPrice < $minPrice) {
$minPrice = $thisPrice;
$minProd = $childProduct;
}
}
return $minProd;
}
//Force tier pricing to be empty for configurable products:
public function getTierPrice($qty=null, $product)
{
return array();
}
}