Magento 2 Store Switcher-Fehler in "section-config.js" Nicht erfasster TypeError: Eigenschaft '*' von undefined kann nicht gelesen werden (…)

12

Ich implementiere einen benutzerdefinierten Store-Switcher in meinem benutzerdefinierten Design.

Die Blockvorlage lautet wie folgt:

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

Der Link zum neuen Shop wird korrekt angezeigt. Ich denke, das XML-Zeug ist in Ordnung, aber beim Klicken erhalte ich die folgende Fehlermeldung:

section-config.js: 33 Uncaught TypeError: Die Eigenschaft '*' von undefined (…) kann nicht gelesen werden

Das generierte htmlsieht folgendermaßen aus:

<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
quelle
Haben Sie den Befehl deploy ausgeführt und den Ordner var entfernt?
Rakesh Jesadiya
Nö XD Ich werde es tun und nachfassen
Davideghz
Ich bin gerade sudo php bin/magento setup:static-content:deployohne Glück gerannt. Warum soll ich varOrdner entfernen ? Was genau soll ich entfernen?
Davideghz
Sie müssen den gesamten Inhalt des var-Ordners entfernen
Rakesh Jesadiya
1
@davideghz hast du die lösung bekommen?
Mohammad Mujassam

Antworten:

14

Ich hatte das gleiche Problem und fand heraus, dass diese beiden Blöcke aufgrund von Anpassungen im Design nicht mehr aufgerufen wurden.

Die beiden Blöcke werden standardmäßig in der Tabelle hinzugefügt <referenceContainer name="content"> Datei vendor / magento / module-customer / view / frontend / layout / default.xml .

Fügen Sie diese Blöcke erneut in Ihre layout.xml ein:

<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
quelle
Ich habe das gleiche Problem, aber die Blöcke werden gerendert. Ich vermute, es liegt daran, dass ich mich beim Aufrufen der Cart-Reload-Methode in einer requireJs-Methode befinde, aber die JS wird ausgeführt, bevor der Block gerendert wird. Kann ich mich auf ein js-Modul verlassen, um dies zu vermeiden?
bpoiss
1
Hatte gerade genau das gleiche Problem .. bei der Verwendung von github.com/SnowdogApps/magento2-theme-blank-sass (Magento 2.2.6). Das Hinzufügen der beiden obigen Blöcke behebt das Problem. Danke
Giolliano Sulit
4

In unserem Projekt haben wir es in der section-config.jsDatei in der Methode behoben getAffectedSections(wo unser Fehler war).
Wir haben die letzte Zeile ersetzt:

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

Mit dem folgenden:

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

Gibt tatsächlich ein leeres Array zurück, wenn kein Abschnitt betroffen ist.

Flinth
quelle
Funktioniert Ihre Lösung gut?
Jared Chu
1
Ja, es war eine funktionierende Problemumgehung, aber IIRC, die eigentliche Wurzel unseres Problems, war am Ende ein geringfügiger Missbrauch der JS-API. Es hat diese Fehlerbehebung nicht irrelevant gemacht. Es ist immer noch ein Schutz, der sicherstellt, dass der Code weiter ausgeführt wird und in nicht kritischen Fehlerfällen nicht anhält.
Flinth
1
Danke, es funktioniert ..
Ravi Soni
Es funktioniert auch für mich. In einigen Kategorien erhalte ich jedoch einen ungültigen Formularschlüssel, wenn ich die Geschäftsansicht ändere, nachdem die Geschäftsansicht geändert wurde. Bitte aktualisieren Sie die Seite. Es gibt jedoch keine Form ... Ich bin verwirrt
GG
0

Ist auf dasselbe Problem gestoßen, obwohl die customer.section.configund customer.customer.dataordnungsgemäß in die Seite geladen wurden.

In meinem Fall geschah dies jedoch, weil eine Erweiterung zu früh versuchte, ein erneutes Laden von Abschnitten auszulösen (bevor die section-config.js mit der richtigen Konfiguration geladen wurde).

getAffectedSectionsBehebt das Problem, indem ein Haltepunkt in section-config.js hinzugefügt und die URL-Variable überprüft wird. Dann wurde die Erweiterung JS nach dem Block customer.section.config geladen:

<?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
quelle
0

In unserem Fall war dies ein Code in einer Standardvorlage, die die Datei customer-data.js lud, nachdem sie bereits auf der Erfolgsseite aufgerufen wurde.

Wir haben folgende Datei gefunden: vendor/magento/module-checkout/view/frontend/templates/success.phtml

hat diesen Code geladen:

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

Durch das Entfernen dieses Codes wurde das Problem behoben, indem wir eine Kopie dieser Datei in unserem Themenvorlagenverzeichnis erstellt und das fehlerhafte Code-Snippet entfernt haben.

Sie können Chrome Dev-Tools verwenden, um herauszufinden, wo der Fehler aufgetreten ist, und dann kurz bevor Sie in dieser Datei auf Ihrem lokalen Entwickler einen console.trace();Aufruf hinzufügen , um festzustellen, wie die Funktion aufgerufen wurde, die den Fehler in der Konsole auslöst. Folgen Sie der Kette dahin, wo Sie die Dinge nicht richtig laden.

Joshua Fricke
quelle