Erro do comutador Magento 2 Store em “section-config.js” TypeError não capturado: Não é possível ler a propriedade '*' de undefined (…)

12

Estou implementando um alternador de loja personalizado no meu tema personalizado.

O modelo de bloco é o seguinte:

<?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; ?>

O link para a nova loja é exibido corretamente, então acho que o material xml está OK, mas, ao clicar em, recebo o seguinte erro:

section-config.js: 33 TypeError não capturado: Não é possível ler a propriedade '*' de undefined (…)

O gerado htmlé semelhante ao seguinte:

<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>
davideghz
fonte
Você executou o comando deploy e remove a pasta var?
Rakesh Jesadiya
Nope XD eu vou fazê-lo e acompanhar
davideghz
Acabei de correr sudo php bin/magento setup:static-content:deploysem sorte. Por que devo remover a varpasta? O que exatamente devo remover?
Davideghz
você tem que remover todo o conteúdo da pasta var
Rakesh Jesadiya
1
@davideghz você conseguiu a solução?
Mohammad Mujassam

Respostas:

14

Eu tive o mesmo problema e descobri que esses dois blocos não eram mais chamados devido a personalizações no tema.

Os dois blocos são adicionados por padrão no <referenceContainer name="content">fornecedor / magento / module-customer / view / frontend / layout / default.xml.

Tente adicionar novamente esses blocos no seu 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"/>
Anna Völkl
fonte
Eu tenho o mesmo problema, mas os blocos são renderizados. Eu acho que é porque eu estou em um método requireJs enquanto chama o método recarregar carrinho, mas o JS é executado antes do bloco ser renderizado. Posso depender de qualquer módulo js para evitar isso?
bpoiss
1
Só tive exatamente esse mesmo problema .. ao usar o github.com/SnowdogApps/magento2-theme-blank-sass (Magento 2.2.6). A adição dos dois blocos acima corrigiu o problema. Obrigado
giolliano sulit
4

Em nosso projeto, nós o corrigimos no section-config.jsarquivo no método getAffectedSections(que é onde estava o nosso erro).
Substituímos a última linha:

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

Pelo seguinte:

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

Na verdade, retorna uma matriz vazia quando nenhuma seção é afetada.

Flinth
fonte
Sua solução funciona bem?
Jared Chu
1
Sim, foi uma solução alternativa de funcionamento, mas IIRC, a verdadeira raiz do nosso problema foi um leve uso indevido da API JS no final. Não tornou essa correção irrelevante, ainda é uma proteção para garantir que o código continue em execução e não pare por aqui, em casos de erro não críticos.
Flinth
1
Obrigado, está funcionando ..
Ravi Soni
Está funcionando para mim também. Mas, em algumas categorias, quando altero a visualização da loja, após a alteração da visualização da loja, recebo uma chave de formulário inválida. Atualize a página. No entanto, não existe nenhuma forma .... Estou confuso
GG
0

Deparou-se com o mesmo problema, mesmo que o customer.section.confige tenha customer.customer.datasido carregado corretamente na página.

No meu caso, no entanto, isso aconteceu porque uma extensão tentou acionar um recarregamento de seção muito cedo (antes que o section-config.js fosse carregado com a configuração correta).

Conseguiu resolvê-lo adicionando um ponto getAffectedSectionsde interrupção em section-config.js e verificando a variável url. Em seguida, mova a extensão JS para carregar após o bloco customer.section.config:

<?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>
sduif
fonte
0

No nosso caso, era um pouco de código em um modelo padrão que carregava o arquivo customer-data.js depois que ele já havia sido chamado na página de sucesso.

Encontramos o arquivo: vendor/magento/module-checkout/view/frontend/templates/success.phtml

estava carregando este código:

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

A remoção desse código o corrigiu, o que fizemos ao criar uma cópia desse arquivo no diretório de modelos de temas e remover o snippet de código incorreto.

Você pode usar as ferramentas de desenvolvedor do Chrome para descobrir onde o erro estava ocorrendo e, logo antes, naquele arquivo do seu desenvolvedor local, adicionar uma console.trace();chamada para estabelecer o que estava chamando a função que está lançando o erro no console. Siga a corrente até onde você está carregando as coisas incorretamente.

Joshua Fricke
fonte