2012-11-22 25 views
6

Magento'nun 1.6+ sürümlerinde, bir seçenek seçildiğinde ana fiyatlara yönelik% birikim varsayılan değerinin% 100 olduğu olağanüstü bir hata var. Katkıda bulunan diğerMagento katmanlı fiyatları - YIL için x için katmanlı fiyat sınıf beyanı - javascript

for (var i = 0; i > this.tierPrices.length; i++) { 

Bu,% tasarruf ile sorunu çözer ama bu kod bloğu asla çalıştırılmaz olmak

for (var i = 0; i < this.tierPrices.length; i++) { 

gelen hat 747 civarında product.js değişen sürmüşlerdir. Hiçbir şekilde Javascript uzmanı değilim, ancak seçenekler seçildiğinde bu bloğun fiyat seviyesini ve% birikimini güncellediği görülüyor. Sorunun kökü 'yorumda bulunmaktan çok' bulmak istedim.

Firebug'daki hata ayıklamadan itibaren, product.js sınıf düzeyindeki sınıfların yanlış olduğunu fark ettim ve bu nedenle,% tasarrufun neden her zaman% 100 olduğunu hesaplayan bir 0 fiyatının alındığını fark ettim. Kundakçı, product.js sen

$$('.tier-prices .price).each(function (el) { 

katmanlı fiyat alınır yukarıda değiştirirseniz

$$('.price.tier-' + i).each(function (el) { 

kullanarak nesneleri almaya çalışırsa oysa

class="tier-prices product-pricing"> 
     Buy 10 for 
     <span class="price">$40.00</span> 

olarak fiyatı gösterir Ancak bir üründe birden fazla fiyat için, bunları tek tek göndermenin bir yolu yoktur. Yukarıdaki "fiyat", benzersiz bir tanımlayıcıya veya beyan edilen iteratif numaraya sahip değildir.

Sınıf fiyatı için sınıf = "fiyat" nerede beyan edilir? tierprices.phtml kodunda bu bölümü class="price"Mage_Directory_Model_Currency::formatPrecision() gelen sonucudur ve daha derin bir model katmanlarında fiyat Mage::helper('core')->formatPrice();

ekleyebilir olabilir ile biçimlendirilir zaman $this->formatPrice() veya idam bu

<?php echo $this->__('Buy %1$s for %2$s each', $_price['price_qty'], $_price['formated_price'])?> 
+0

iyi bir soru bu –

cevap

6

Bir müşterinin Magento sitesini 1.7.0.2 sürümüne yükselttikten sonra gerçekten beni rahatsız etmeye başladığı için biraz zaman harcadım.

Bunun iki kısmı vardır, konumları ve düzeltmeleri belirteceğim, ancak bunlar yükseltme kanıtı olmayacaktır (bunun için dosyaların kopyalarını oluşturmak ve bunları belirli klasörlere koymak isteyeceksiniz Ancak, söz konusu JS dosyası ile mümkün olup olmadığından emin değilim).

1) Görünüm Fix /design/frontend/base/default/template/catalog/product/view/tierprices.phtml

Eğer çizgiler aşağıdaki kodla 32-34

$_product = $this->getProduct(); 
$_tierPrices = $this->getTierPrices(); 
$_finalPriceInclTax = $this->helper('tax')->getPrice($_product, $_product->getFinalPrice(), true); 

değiştirmeniz gerekiyor dosyasında

:

$_product = $this->getProduct(); 
$_tierPrices = array(); 

foreach($this->getTierPrices() as $index => $info) { 
    $_tierPrices[$index] = $info; 
    $_tierPrices[$index]['formated_price'] = str_replace('class="price"', 'class="price tier-'.$index.'"', $info['formated_price']); 
    $_tierPrices[$index]['formated_price_incl_tax'] = str_replace('class="price"', 'class="price tier-'.$index.' tier-'.$index.'-incl-tax"', $info['formated_price_incl_tax']); 
} 
$_finalPriceInclTax = $this->helper('tax')->getPrice($_product, $_product->getFinalPrice(), true); 

Bu düzeltir ile ilgili Sınıf zaten anlaştığınız gibi doğru şekilde işlenmiyor. Here is where I found this code - tüm sorunları çözmese de, JS değişiyor.

2) JS dosyasına

düzeltmek js/Varien/product.js Eğer çizgileri 757-769 değiştirmeniz gerekiyor: Bununla

$$('.benefit').each(function (el) { 
    var parsePrice = function (html) { 
     return parseFloat(/\d+\.?\d*/.exec(html)); 
    }; 
    var container = $(this.containers[3]) ? this.containers[3] : this.containers[0]; 
    var price = parsePrice($(container).innerHTML); 
    var tierPrice = $$('.price.tier-' + i); 
    tierPrice = tierPrice.length ? parseInt(tierPrice[0].innerHTML, 10) : 0; 
    var $percent = Selector.findChildElements(el, ['.percent.tier-' + i]); 
    $percent.each(function (el) { 
     el.innerHTML = Math.ceil(100 - ((100/price) * tierPrice)); 
    }); 
}, this); 

:

// 
// Code fixed to prevent the redundant inner loop and to use actual tiered pricing in calculation 
// It also takes the optional price variants into consideration (eg: +£2 for a blue tshirt) 
// Note: I've made this comment deliberately large, to keep the line numbers in sync 
// 
var parsePrice = function (html) { 
    return parseFloat(/\d+\.?\d*/.exec(html)); 
}; 
var container = $(this.containers[3]) ? this.containers[3] : this.containers[0]; 
var price = parsePrice($(container).innerHTML); 
$$('.percent.tier-' + i).each(function (el) { 
    el.innerHTML = Math.ceil(100 - ((100/price) * (this.tierPrices[i] + parseFloat(optionPrices)))); 
}, this); 

bu en az bir kişi kaydeder umut Hayatlarının birkaç saati.

T

+1

Teşekkür Tr1stan için 1, bir tedavi çalışır. – GenAtBlueJalappeno

+0

Teşekkür ederim, harika çalıştı. Cildinizde bir custom product.js varsa bunu orada değiştirmelisiniz. – Jonathan

+0

Teşekkür ederim, bana çok zaman kazandırdın! – fahu

0

benziyor Mage_Directory_Model_Currency'u genişleterek (ve yeniden yazarak) benzersiz bir tanımlayıcıdır, ancak her yerde formatPrecision'un kullanıldığını unutmayın. Böylece, katman fiyatlarını biçimlendirmek için kendi yardımcı/model mantığınızı yazabilirsiniz.

İlgili konular