태그 보관물: locale

locale

Magento 2-미국 이외 지역의 제품 세부 정보 페이지에서 제품 가격이 0.00으로 변경됨

Magento 2.0.4를 설치 한 후 매우 이상한 문제에 직면하고 있습니다. 가격이 $ 12 인 제품을 만들고 백엔드의 Magento 구성에서 로캘을 변경했습니다.

아래는 목록 페이지의 스크린 샷입니다.

여기에 이미지 설명을 입력하십시오

상세 페이지는 아래 스크린 샷을 참조하십시오.

두 스크린 샷의 차이점을 알 수 있습니다. 예, 제품 세부 정보 페이지에는 $ 0.00 가격이 표시되지만 목록 페이지에는 추가 한 가격이 유지됩니다.

제품 세부 정보 페이지는 1-2 초 후에 올바른 가격을 $ 0,00 (자동으로 업데이트)으로 자동 업데이트합니다.

아래 코드를 찾으십시오.

$('[data-price-type="' + priceCode + '"]', this.element).html(priceTemplate({data: price}));

코드에서 더 디버그하고 Magento 2 pricebox 위젯에 매개 변수를 전달하는 다른 자바 스크립트 코드를 찾습니다.

<script>
    require([
        'jquery',
        'Magento_Catalog/js/price-box'
    ], function($){
        var priceBoxes = $('[data-role=priceBox]');

        priceBoxes = priceBoxes.filter(function(index, elem){
            return !$(elem).find('.price-from').length;
        });

        priceBoxes.priceBox({'priceConfig': <?php /* @escapeNotVerified */ echo $block->getJsonConfig() ?>});
    });
</script>

이제 getJsonConfig () 메소드를 확인했습니다.

  $product = $this->getProduct();

        if (!$this->hasOptions()) {
            $config = [
                'productId' => $product->getId(),
                'priceFormat' => $this->_localeFormat->getPriceFormat()
                ];
            return $this->_jsonEncoder->encode($config);
        }

        $tierPrices = [];
        $tierPricesList = $product->getPriceInfo()->getPrice('tier_price')->getTierPriceList();
        foreach ($tierPricesList as $tierPrice) {
            $tierPrices[] = $this->priceCurrency->convert($tierPrice['price']->getValue());
        }
        $config = [
            'productId' => $product->getId(),
            'priceFormat' => $this->_localeFormat->getPriceFormat(),
            'prices' => [
                'oldPrice' => [
                    'amount' => $this->priceCurrency->convert(
                        $product->getPriceInfo()->getPrice('regular_price')->getAmount()->getValue()
                    ),
                    'adjustments' => []
                ],
                'basePrice' => [
                    'amount' => $this->priceCurrency->convert(
                        $product->getPriceInfo()->getPrice('final_price')->getAmount()->getBaseAmount()
                    ),
                    'adjustments' => []
                ],
                'finalPrice' => [
                    'amount' => $this->priceCurrency->convert(
                        $product->getPriceInfo()->getPrice('final_price')->getAmount()->getValue()
                    ),
                    'adjustments' => []
                ]
            ],
            'idSuffix' => '_clone',
            'tierPrices' => $tierPrices
        ];

코드를 통해 많은 디버깅을 수행했으며 로케일 지원을 위해 ICUDATA를 사용하고 있다는 결론에 도달했습니다.

나는이 모든 것에 붙어 있습니다. 가격 형식 문제 인 것 같습니다.

Persion (이란)과 같은 특정 로케일 옵션에 대해서만이 문제가 발생하는지 확인하십시오.



답변

이 문제가 해결되었습니다. Magento2를 최신 안정 버전으로 업데이트하십시오.

GIT & Composer에서 설치 한 경우 다음 단계를 수행하십시오.

  • 당신은 당신의 변화를 막아야보다
  • GIT PULL 최신 안정 브랜치 즉 2.1
  • 작곡가 업데이트
  • 마 젠토 업그레이드 ( bin/magento setup:upgrade)

그렇지 않으면 magento 웹 사이트에서 최신 버전을 다운로드하는 것보다 zip 폴더 다운로드를 사용하여 설치하고 캐시를 지우고 실행하는 데 필요한 것보다 새로운 zip을 사용하는 모든 파일을 재정의하는 경우

bin/magento setup:upgrade

답변

다음 명령을 사용하여 magento를 업그레이드하십시오.

bin / magento 설정 : 업그레이드

bin / magento 설정 : db-schema : 업그레이드

php -d memory_limit = -1 bin / magento 설정 : di : compile

php -d memory_limit = -1 bin / magento 설정 : 정적 내용 : 배포


답변

아래 코드를 업데이트하십시오 :

경로- lib/internal/Magento/Framework/Locale/Format.php

class Format implements \Magento\Framework\Locale\FormatInterface
{
    const DEFAULT_NUMBER_SET = 'latn';
    /**
     * @var \Magento\Framework\App\ScopeResolverInterface
     */
@@ -104,12 +105,18 @@ public function getPriceFormat($localeCode = null, $currencyCode = null)
            $currency = $this->_scopeResolver->getScope()->getCurrentCurrency();
        }
        $localeData = (new DataBundle())->get($localeCode);
        /* $format = $localeData['NumberElements']['latn']['patterns']['currencyFormat']
            ?: explode(';', $localeData['NumberPatterns'][1])[0];
        $decimalSymbol = $localeData['NumberElements']['latn']['symbols']['decimal']
            ?: $localeData['NumberElements'][0];
        $groupSymbol = $localeData['NumberElements']['latn']['symbols']['group']
            ?: $localeData['NumberElements'][1]; */
 //start updated code
        $defaultSet = $localeData['NumberElements']['default'] ?: self::DEFAULT_NUMBER_SET;
        $format = $localeData['NumberElements'][$defaultSet]['patterns']['currencyFormat']
            ?: ($localeData['NumberElements'][self::DEFAULT_NUMBER_SET]['patterns']['currencyFormat']
                ?: explode(';', $localeData['NumberPatterns'][1])[0]);
        $decimalSymbol = $localeData['NumberElements'][$defaultSet]['symbols']['decimal']
            ?: ($localeData['NumberElements'][self::DEFAULT_NUMBER_SET]['symbols']['decimal']
                ?: $localeData['NumberElements'][0]);
        $groupSymbol = $localeData['NumberElements'][$defaultSet]['symbols']['group']
            ?: ($localeData['NumberElements'][self::DEFAULT_NUMBER_SET]['symbols']['group']
                ?: $localeData['NumberElements'][1]);

  // end updated code

        $pos = strpos($format, ';');
        if ($pos !== false) {

그것이 당신을 위해 일하기를 바랍니다.


답변