Harga bertingkat Magento - deklarasi kelas untuk harga bertingkat dalam BELI x untuk Y - javascript
Ada bug yang belum terselesaikan di versi Magento 1.6+ di mana persentase penghematan untuk harga bertingkat secara default menjadi 100% ketika sebuah opsi dipilih. Kontributor lain telah menyarankan untuk mengubah product.js sekitar baris 747 dari
for (var i = 0; i < this.tierPrices.length; i++) {
untuk menjadi
for (var i = 0; i > this.tierPrices.length; i++) {
Ini menyelesaikan masalah dengan % penghematan tetapi blok kode itu tidak pernah dijalankan. Saya sama sekali bukan ahli Javascript tetapi blok ini tampaknya memperbarui harga tingkat dan % penghematan saat opsi dipilih. Saya ingin menemukan akar masalahnya, daripada 'mengomentarinya'.
Dari hasil debugging saya di Firebug, saya menyadari bahwa kelas untuk harga bertingkat salah di product.js dan oleh karena itu, harga bertingkat 0 didapatkan, yang menjelaskan mengapa persentase penghematan selalu 100%. Firebug menampilkan harga sebagai
class="tier-prices product-pricing">
Buy 10 for
<span class="price">$40.00</span>
sedangkan product.js mencoba mengambil objek menggunakan
$$('.price.tier-' + i).each(function (el) {
Jika Anda mengubah yang di atas menjadi
$$('.tier-prices .price).each(function (el) {
harga tingkat diambil, tetapi untuk lebih dari satu harga tingkat pada suatu produk, tidak ada cara untuk merujuknya secara individual. Kelas "price" di atas tidak memiliki pengenal unik atau nomor iteratif yang dinyatakan.
Di mana class="price" dideklarasikan untuk harga tingkat? Dalam kode tierprices.phtml terlihat seperti ini
<?php echo $this->__('Buy %1$s for %2$s each', $_price['price_qty'], $_price['formated_price'])?>
Jawaban #1
Saya baru saja menghabiskan beberapa waktu untuk ini karena itu benar-benar mulai mengganggu saya setelah saya meng-upgrade situs Magento seorang pelanggan ke 1.7.0.2.
Ada dua bagian dari ini, saya akan menyebutkan lokasinya dan perbaikannya, tetapi ini tidak akan tahan terhadap pembaruan (untuk itu Anda ingin membuat salinan file-file tersebut dan menempatkannya di folder khusus tema Anda, meskipun saya tidak yakin apakah ini mungkin dengan file JS yang dimaksud).
1) Perbaikan Tampilan
Dalam file /design/frontend/base/default/template/catalog/product/view/tierprices.phtml
Anda perlu mengganti baris 32-34
$_product = $this->getProduct();
$_tierPrices = $this->getTierPrices();
$_finalPriceInclTax = $this->helper('tax')->getPrice($_product, $_product->getFinalPrice(), true);
dengan kode berikut:
$_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);
Ini memperbaiki masalah dengan kelas yang tidak dirender dengan benar seperti yang sudah Anda ketahui. Inilah tempat saya menemukan kode ini - meskipun tidak memperbaiki semua masalah, itulah sebabnya perubahan JS dilakukan.
2) Perbaikan JS
di file js/Varien/product.js Anda perlu mengganti baris 757-769:
$$('.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);
Dengan ini:
//
// 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);
Saya berharap ini setidaknya bisa menyelamatkan satu orang beberapa jam dari hidup mereka.
T
Jawaban #2
Bagian class="price" adalah hasil dari Mage_Directory_Model_Currency::formatPrecision() dan dijalankan ketika $this->formatPrice() atau pada lapisan model yang lebih dalam harga diformat dengan Mage::helper('core')->formatPrice();
Anda bisa menambahkan pengenal unik dengan memperluas (dan menulis ulang) Mage_Directory_Model_Currency tetapi perlu diingat bahwa formatPrecision digunakan di mana-mana. Jadi Anda bisa menulis logika helper/model sendiri untuk memformat harga tingkat.
