"section-config.js"에서 Magento 2 Store 스위처 오류가 발생하지 않음 TypeError : undefined (…)의 '*'속성을 읽을 수 없습니다


12

내 사용자 지정 테마에서 사용자 지정 저장소 스위처를 구현하고 있습니다.

블록 템플릿은 다음과 같습니다.

<?php if (count($block->getStores())>1): ?>
    <?php $id = $block->getIdModifier() ? '-' . $block->getIdModifier() : ''?>

    <span><?php echo $block->escapeHtml($block->getStoreName()) ?></span>

    <span>/</span>

    <?php foreach ($block->getStores() as $_lang): ?>
        <?php if ($_lang->getId() != $block->getCurrentStoreId()): ?>
            <span class="view-<?php echo $block->escapeHtml($_lang->getCode()); ?> switcher-option">
                <a href="#" data-post='<?php /* @escapeNotVerified */ echo $block->getTargetStorePostData($_lang); ?>'>
                    <?php echo $block->escapeHtml($_lang->getName()) ?>
                </a>
            </span>
        <?php endif; ?>
    <?php endforeach; ?>

<?php endif; ?>

새 상점에 대한 링크가 올바르게 표시되어 XML 항목이 정상이라고 생각하지만 클릭하면 다음 오류가 발생합니다.

section-config.js : 33 Uncaught TypeError : undefined (…)의 '*'속성을 읽을 수 없습니다

생성 된 내용 html은 다음과 같습니다.

<span class="view-it switcher-option">
  <a href="#" data-post="{"action":"http:\/\/test.mysite.eu\/stores\/store\/switch\/","data":{"___store":"it","uenc":"aHR0cDovL3Rlc3QuZnJhZ2lhY29tb21pbGFuby5ldS8,"}}">
    It
  </a>
</span>

deploy 명령을 실행하고 var 폴더를 제거 했습니까?
Rakesh Jesadiya

nope XD 내가 할 것이고 후속 조치
davideghz

난 그냥 sudo php bin/magento setup:static-content:deploy운없이 실행했습니다 . var폴더를 왜 제거해야 합니까? 정확히 무엇을 제거해야합니까?
davideghz

var 폴더의 모든 내용을 제거해야합니다
Rakesh Jesadiya

1
@davideghz 솔루션을 얻었습니까?
Mohammad Mujassam

답변:


14

나는 같은 문제가 있었고 테마의 사용자 정의로 인해 더 이상 호출되지 않은이 두 블록을 발견했습니다.

두 블록은 기본적 <referenceContainer name="content">으로 vendor / magento / module-customer / view / frontend / layout / default.xml에 추가됩니다.

layout.xml에 다음 블록을 다시 추가하십시오.

<block name="customer.section.config" class="Magento\Customer\Block\SectionConfig"
    template="Magento_Customer::js/section-config.phtml"/>
<block name="customer.customer.data"
    class="Magento\Customer\Block\CustomerData"
    template="Magento_Customer::js/customer-data.phtml"/>

나는 같은 문제가 있지만 블록이 렌더링됩니다. 카트 리로드 메소드를 호출하는 동안 requireJs 메소드에 있기 때문에 블록이 렌더링되기 전에 JS가 실행되기 때문입니다. 이것을 피하기 위해 js 모듈을 사용할 수 있습니까?
bpoiss

1
github.com/SnowdogApps/magento2-theme-blank-sass (Magento 2.2.6) 를 사용하는 동안 똑같은 문제가 발생했습니다 . 위의 두 블록을 추가하면 문제가 해결되었습니다. 감사합니다
giolliano sulit

6

프로젝트에서 우리 section-config.js는 메소드 의 파일에서 getAffectedSections오류를 수정했습니다 (오류가 발생한 위치).
우리는 마지막 줄을 교체했습니다 :

return _.union(_.toArray(actions), _.toArray(sections['*']));

다음에 의해 :

return (sections && sections.length > 0) ? _.union(_.toArray(actions), _.toArray(sections['*'])) : {};

영향을받는 섹션이 없을 때 실제로 빈 배열을 반환합니다.


솔루션이 잘 작동합니까?
Jared Chu

1
그렇습니다. 이것은 작동하는 해결 방법이지만, 우리 문제의 근본 원인 인 IIRC는 결국 JS API를 약간 잘못 사용했습니다. 이 수정 프로그램은 관련이 없었으며, 중요한 오류가 아닌 경우 코드가 계속 실행되고 여기서 멈추지 않도록 보호합니다.
Flinth

1
감사합니다, 그것은 작동합니다 ..
라비 소니

그것은 또한 나를 위해 일하고 있습니다. 그러나 상점보기를 변경하면 일부 카테고리에서 상점보기가 변경된 후 잘못된 양식 키가 표시됩니다. 페이지를 새로 고침하십시오. 아무 형식도 없습니다 .... 혼란스러워
GG

0

customer.section.configcustomer.customer.data페이지에 제대로로드 된 경우에도 동일한 문제가 발생했습니다 .

그러나 내 경우에는 확장 프로그램이 섹션 다시로드를 너무 일찍 트리거하려고했기 때문에 발생했습니다 (섹션 -config.js가 올바른 구성으로로드되기 전에).

getAffectedSectionssection-config.js에 중단 점을 추가 하고 url 변수를 확인하여 문제를 해결했습니다 . 그런 다음 customer.section.config 블록 다음에로드하도록 확장 JS를 이동했습니다.

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <move element="extension.js.block" destination="content" after="customer.section.config"/> 
    </body>
</page>

0

우리의 경우 이것은 성공 페이지에서 이미 호출 된 후 customer-data.js 파일을로드하는 기본 템플릿의 약간의 코드였습니다.

파일을 찾았습니다 : vendor/magento/module-checkout/view/frontend/templates/success.phtml

이 코드를로드했다 :

<script>
    require([
        'Magento_Customer/js/customer-data'
    ], function (customerData) {
        var sections = ['cart'];
        customerData.invalidate(sections);
        customerData.reload(sections, true);
    });
</script>

이 코드를 제거하면 테마 템플리트 디렉토리에이 파일의 사본을 작성하고 문제가되는 코드 스 니펫을 제거하여 수정했습니다.

Chrome 개발자 도구를 사용하여 오류가 발생한 위치를 찾은 다음 로컬 개발자의 해당 파일에서 바로 console.trace();호출을 추가 하여 콘솔에서 오류를 발생시키는 함수를 호출하는 대상을 설정하십시오. 체인을 따라 물건을 부적절하게 적재하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.