Błąd przełącznika sklepu Magento 2 w pliku „section-config.js” Uncaught TypeError: Nie można odczytać właściwości „*” niezdefiniowanej (…)

12

Implementuję niestandardowy przełącznik sklepu w moim niestandardowym motywie.

Szablon bloku wygląda następująco:

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

Link do nowego sklepu jest wyświetlany poprawnie, więc chyba plik XML jest OK, ale po kliknięciu pojawia się następujący błąd:

section-config.js: 33 Uncaught TypeError: Nie można odczytać właściwości „*” niezdefiniowanej (…)

Wygenerowany htmlwygląda następująco:

<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
źródło
Czy uruchomiłeś polecenie wdrażania i usuwasz folder var?
Rakesh Jesadiya
nie XD Zrobię to i będę śledzić
davideghz
Właśnie uciekłem sudo php bin/magento setup:static-content:deploybez szczęścia. Dlaczego mam usunąć varfolder? Co dokładnie powinienem usunąć?
davideghz
musisz usunąć całą zawartość folderu var
Rakesh Jesadiya
1
@davideghz, czy masz rozwiązanie?
Mohammad Mujassam

Odpowiedzi:

14

Miałem ten sam problem i dowiedziałem się, że te dwa bloki nie zostały już wywołane z powodu dostosowań w motywie.

Dwa bloki są domyślnie dodawane w <referenceContainer name="content">pliku vendor / magento / module-customer / view / frontend / layout / default.xml.

Spróbuj ponownie dodać te bloki w pliku 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
źródło
Mam ten sam problem, ale bloki są renderowane. Wydaje mi się, że dzieje się tak, ponieważ korzystam z metody wymaganej podczas wywoływania metody przeładowania koszyka, ale JS jest wykonywany przed renderowaniem bloku. Czy mogę polegać na dowolnym module js, aby tego uniknąć?
bpoiss
1
Właśnie miałem ten sam problem .. podczas korzystania z github.com/SnowdogApps/magento2-theme-blank-sass (Magento 2.2.6). Dodanie dwóch powyższych bloków rozwiązało problem. Dzięki
giolliano sulit
5

W naszym projekcie naprawiliśmy to w section-config.jspliku w metodzie getAffectedSections(gdzie był nasz błąd).
Zastąpiliśmy ostatnią linię:

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

Przez następujące:

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

Faktycznie zwraca pustą tablicę, gdy nie ma to wpływu na sekcję.

Flinth
źródło
Czy twoje rozwiązanie działa dobrze?
Jared Chu
1
Tak, to było obejście funkcjonalne, ale IIRC, prawdziwym źródłem naszego problemu było niewielkie niewłaściwe użycie API JS. Nie spowodowało to, że ta poprawka stała się nieistotna, nadal stanowi ochronę zapewniającą, że kod będzie działał dalej i nie zatrzyma się tutaj, w przypadkach niekrytycznych błędów.
Flinth
1
Dzięki, działa ..
Ravi Soni
To też działa dla mnie. Ale w niektórych kategoriach, gdy zmieniam widok sklepu, po zmianie widoku sklepu otrzymuję nieprawidłowy klucz formularza. Odśwież stronę. Nie ma tam żadnej formy ... Jestem zdezorientowany
GG
0

Natknąłem się na ten sam problem, mimo że customer.section.configi customer.customer.datazostały poprawnie załadowane na stronę.

W moim przypadku stało się tak, ponieważ rozszerzenie próbowało zbyt wcześnie uruchomić sekcję przeładowywania sekcji (zanim sekcja-config.js została załadowana z prawidłową konfiguracją).

Udało się go rozwiązać, dodając punkt przerwania w getAffectedSectionspliku section-config.js i sprawdzając zmienną url. Następnie przeniesiono rozszerzenie JS, aby załadować po bloku 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
źródło
0

W naszym przypadku był to fragment kodu w domyślnym szablonie, który ładował plik client-data.js po wywołaniu go już na stronie powodzenia.

Znaleziono plik: vendor/magento/module-checkout/view/frontend/templates/success.phtml

ładował ten kod:

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

Usunięcie tego kodu naprawiło go, co zrobiliśmy, tworząc kopię tego pliku w naszym katalogu szablonów motywów i usuwając niepoprawny fragment kodu.

Możesz użyć narzędzi Chrome Dev, aby dowiedzieć się, gdzie wystąpił błąd, a następnie bezpośrednio w tym pliku w lokalnym urządzeniu deweloperskim dodać console.trace();wywołanie, aby ustalić, co wywołało funkcję, która powoduje błąd w konsoli. Podążaj za łańcuchem do niewłaściwego ładowania rzeczy.

Joshua Fricke
źródło