Errore switcher archivio Magento 2 in "section-config.js" TypeError non rilevato: impossibile leggere la proprietà '*' di undefined (...)


12

Sto implementando un commutatore negozio personalizzato nel mio tema personalizzato.

Il modello di blocco è il seguente:

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

Il collegamento al nuovo negozio è visualizzato correttamente, quindi suppongo che il materiale XML sia OK, ma al clic ricevo il seguente errore:

section-config.js: 33 Uncaught TypeError: Impossibile leggere la proprietà '*' di undefined (...)

Il generato htmlè simile al seguente:

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

Hai eseguito il comando deploy e hai rimosso la cartella var?
Rakesh Jesadiya,

no XD Lo farò e lo seguirò
davideghz,

Ho appena corso sudo php bin/magento setup:static-content:deploysenza fortuna. Perché dovrei rimuovere la varcartella? Cosa devo rimuovere esattamente?
davideghz,

devi rimuovere tutto il contenuto della cartella var
Rakesh Jesadiya,

1
@davideghz hai preso la soluzione?
Mohammad Mujassam,

Risposte:


14

Ho avuto lo stesso problema e ho scoperto che questi due blocchi non venivano più chiamati a causa delle personalizzazioni nel tema.

I due blocchi vengono aggiunti per impostazione predefinita in <referenceContainer name="content">vendor / magento / module-customer / view / frontend / layout / default.xml.

Prova ad aggiungere nuovamente questi blocchi nel tuo 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"/>

Ho lo stesso problema ma i blocchi sono resi. Immagino che sia perché sono in un metodo requireJs mentre chiamo il metodo di ricarica del carrello, ma JS viene eseguito prima che il blocco venga reso. Posso fare affidamento su qualsiasi modulo js per evitarlo?
bpoiss,

1
Ho appena avuto lo stesso identico problema ... durante l'utilizzo di github.com/SnowdogApps/magento2-theme-blank-sass (Magento 2.2.6). L'aggiunta dei due blocchi precedenti ha risolto il problema. Grazie
giolliano sulit,

5

Nel nostro progetto lo abbiamo corretto nel section-config.jsfile nel metodo getAffectedSections(che è dove si trovava il nostro errore).
Abbiamo sostituito l'ultima riga:

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

Con il seguente:

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

Restituisce effettivamente un array vuoto quando nessuna sezione è interessata.


La tua soluzione funziona bene?
Jared Chu,

1
Sì, era una soluzione funzionante, ma IIRC, la vera radice del nostro problema era un leggero uso improprio dell'API JS alla fine. Non ha reso irrilevante questa correzione, è comunque una protezione per garantire che il codice continui a funzionare e non si fermi qui, in casi di errore non critici.
Flinth,

1
Grazie, Funziona ..
Ravi Soni,

Funziona anche per me. Ma in alcune categorie quando cambio la visualizzazione dello store, dopo la modifica della visualizzazione dello store ottengo una chiave del modulo non valida. Si prega di aggiornare la pagina. Non c'è nessuna forma però ... Sono confuso
GG

0

Si è verificato lo stesso problema anche se customer.section.confige customer.customer.datasono stati caricati correttamente nella pagina.

Nel mio caso, tuttavia, è successo perché un'estensione ha tentato di attivare un ricaricamento della sezione troppo presto (prima che section-config.js fosse caricato con la configurazione corretta).

Gestito per risolverlo aggiungendo un punto di interruzione in getAffectedSectionssection-config.js e controllando la variabile url. Quindi spostato l'estensione JS da caricare dopo il blocco 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>

0

Nel nostro caso si trattava di un po 'di codice in un modello predefinito che stava caricando il file customer-data.js dopo che era già stato chiamato nella pagina di successo.

Abbiamo trovato il file: vendor/magento/module-checkout/view/frontend/templates/success.phtml

stava caricando questo codice:

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

La rimozione di questo codice lo ha risolto, cosa che abbiamo fatto creando una copia di questo file nella nostra directory dei modelli di temi e rimuovendo lo snippet di codice offensivo.

Puoi utilizzare gli strumenti di Chrome Dev per scoprire dove si stava verificando l'errore e poi poco prima in quel file sul tuo sviluppatore locale aggiungere una console.trace();chiamata per stabilire ciò che stava chiamando la funzione che sta generando l'errore nella console. Segui la catena in cui stai caricando le cose in modo errato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.