Erreur de commutateur de magasin Magento 2 dans "section-config.js" TypeError non capturé: Impossible de lire la propriété '*' de non défini (…)

12

J'implémente un sélecteur de magasin personnalisé dans mon thème personnalisé.

Le modèle de bloc est le suivant:

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

Le lien vers le nouveau magasin est correctement affiché, donc je suppose que le contenu xml est OK, mais au clic, je reçois l'erreur suivante:

section-config.js: 33 TypeError non capturé: impossible de lire la propriété '*' de non défini (…)

Le htmlfichier généré ressemble à ceci:

<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
la source
Avez-vous exécuté la commande deploy et supprimé le dossier var?
Rakesh Jesadiya
non XD je vais le faire et suivre
davideghz
Je viens de courir sudo php bin/magento setup:static-content:deploysans chance. Pourquoi dois-je supprimer un vardossier? Que dois-je retirer exactement?
davideghz
vous devez supprimer tout le contenu du dossier var
Rakesh Jesadiya
1
@davideghz avez-vous trouvé la solution?
Mohammad Mujassam

Réponses:

14

J'ai eu le même problème et j'ai découvert que ces deux blocs n'étaient plus appelés en raison de personnalisations dans le thème.

Les deux blocs sont par défaut ajoutés dans le <referenceContainer name="content">fournisseur / magento / module-customer / view / frontend / layout / default.xml.

Essayez de rajouter ces blocs dans votre 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
la source
J'ai le même problème mais les blocs sont rendus. Je suppose que c'est parce que je suis dans une méthode requireJs lors de l'appel de la méthode cart reload, mais le JS est exécuté avant le rendu du bloc. Puis-je dépendre d'un module js pour éviter cela?
bpoiss du
1
Je viens d'avoir exactement le même problème .. lors de l'utilisation de github.com/SnowdogApps/magento2-theme-blank-sass (Magento 2.2.6). L'ajout des deux blocs ci-dessus a résolu le problème. Merci
giolliano sulit
5

Sur notre projet, nous l'avons corrigé dans le section-config.jsfichier de la méthode getAffectedSections(où se trouvait notre erreur).
Nous avons remplacé la dernière ligne:

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

Par le suivant:

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

Retourne réellement un tableau vide lorsqu'aucune section n'est affectée.

Flinth
la source
Votre solution fonctionne-t-elle bien?
Jared Chu
1
Oui, c'était une solution de contournement fonctionnelle, mais IIRC, la vraie racine de notre problème était à la fin une légère mauvaise utilisation de l'API JS. Cela n'a pas rendu ce correctif non pertinent, c'est toujours une protection pour garantir que le code continue de fonctionner et ne s'arrête pas là, dans les cas d'erreur non critiques.
Flinth
1
Merci, ça marche ..
Ravi Soni
Cela fonctionne aussi pour moi. Mais dans certaines catégories, lorsque je change la vue du magasin, une fois la vue du magasin modifiée, j'obtiens une clé de formulaire non valide. Veuillez rafraîchir la page. Aucune forme n'est là cependant .... Je suis confus
GG
0

A traversé le même problème même si le customer.section.configet customer.customer.dataont été correctement chargés dans la page.

Dans mon cas, cependant, cela s'est produit car une extension a tenté de déclencher un rechargement de section trop tôt (avant que section-config.js ne soit chargé avec la bonne configuration).

Géré pour le résoudre en ajoutant un point d'arrêt dans getAffectedSectionssection-config.js et en vérifiant la variable url. Ensuite, vous avez déplacé l'extension JS à charger après le bloc 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
la source
0

Dans notre cas, il s'agissait d'un peu de code dans un modèle par défaut qui chargeait le fichier customer-data.js après qu'il avait déjà été appelé sur la page de réussite.

Nous avons trouvé le fichier: vendor/magento/module-checkout/view/frontend/templates/success.phtml

chargeait ce code:

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

La suppression de ce code l'a corrigé, ce que nous avons fait en créant une copie de ce fichier dans notre répertoire de modèles de thèmes et en supprimant l'extrait de code incriminé.

Vous pouvez utiliser les outils Chrome Dev pour savoir où l'erreur s'est produite, puis juste avant dans ce fichier sur votre développeur local, ajoutez un console.trace();appel pour établir ce qui appelait la fonction qui génère l'erreur dans la console. Suivez la chaîne jusqu'à l'endroit où vous chargez mal les choses.

Joshua Fricke
la source