2012-11-22 25 views
6

Có lỗi nổi bật trong 1,6 phiên bản Magento, nơi% tiết kiệm cho giá cấp mặc định là 100% khi tùy chọn được chọn. người đóng góp khác đã gợi ý thay đổi product.js xung quanh dòng 747 từGiá tầng Magento - khai báo lớp cho giá tầng trong MUA x cho Y - javascript

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

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

này giải quyết vấn đề này với% tiết kiệm nhưng mã khối không bao giờ được thực thi. Tôi không phải là chuyên gia Javascript nhưng khối này dường như đang cập nhật giá tầng và% tiết kiệm khi tùy chọn được chọn. Tôi muốn tìm gốc của vấn đề, thay vì 'bình luận nó'.

Từ việc gỡ lỗi trong Firebug, tôi nhận thấy rằng các lớp cho giá tầng là sai trong product.js và do đó, giá tầng 0 được truy lục, chiếm tỷ lệ% tiết kiệm luôn là 100%. Firebug cho thấy giá như

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

trong khi product.js đang cố gắng để lấy các đối tượng sử dụng

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

Nếu bạn thay đổi ở trên để

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

giá tầng được lấy ra, nhưng đối với nhiều hơn một cấp giá trên một sản phẩm, không có cách nào để chỉ riêng chúng. Lớp "giá" ở trên không có số nhận dạng duy nhất hoặc số lặp được khai báo.

Trường hợp là class = "price" được khai báo cho giá tier? Trong đoạn mã của tierprices.phtml nó trông như thế này

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

câu hỏi hay 1 cho rằng –

Trả lời

6

Tôi đã dành chút thời gian cho việc này vì nó thực sự bắt đầu gây lỗi cho tôi sau khi tôi nâng cấp trang web Magento của khách hàng lên 1.7.0.2.

Có hai phần, tôi sẽ nêu rõ vị trí và các bản sửa lỗi, nhưng đây sẽ không phải là bằng chứng nâng cấp (vì bạn muốn tạo bản sao của các tệp và đặt chúng trong thư mục chủ đề cụ thể của mình , mặc dù tôi không chắc chắn nếu nó có thể với các tập tin JS trong câu hỏi).

1) Xem Fix

Trong tập tin /design/frontend/base/default/template/catalog/product/view/tierprices.phtml

bạn cần phải thay thế dòng 32-34

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

với đoạn mã sau:

$_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); 

này sửa chữa các vấn đề về lớp học không được hiển thị chính xác như bạn đã tìm ra. Here is where I found this code - mặc dù nó không khắc phục được tất cả các vấn đề, do đó các thay đổi JS.

2) JS sửa chữa

trong file js/Varien/product.js bạn cần phải thay thế dòng 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); 

Với điều này:

// 
// 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); 

Tôi hy vọng điều này giúp tiết kiệm ít nhất một người một vài giờ trong cuộc đời của họ.

T

+1

Cảm ơn Tr1stan, một công trình xử. – GenAtBlueJalappeno

+0

Cảm ơn bạn, đã làm việc tuyệt vời. Đừng quên nếu bạn có một product.js tùy chỉnh trong da của bạn, bạn nên sửa đổi nó ở đó. – Jonathan

+0

Cảm ơn bạn, bạn đã dành cho tôi rất nhiều thời gian! – fahu

0

Phần class="price" là kết quả từ Mage_Directory_Model_Currency::formatPrecision() và thực thi khi $this->formatPrice() hoặc trong các lớp mô hình sâu hơn giá được định dạng với Mage::helper('core')->formatPrice();

Bạn có thể thêm định danh duy nhất bằng cách mở rộng (và viết lại) Mage_Directory_Model_Currency nhưng lưu ý rằng formatPrecision được sử dụng ở mọi nơi. Vì vậy, bạn có thể viết helper/mô hình logic của riêng bạn để định dạng giá tầng.

Các vấn đề liên quan