Error de conmutador de tienda Magento 2 en "section-config.js" Error de tipo no capturado: no se puede leer la propiedad '*' de indefinido (...)

12

Estoy implementando un conmutador de tienda personalizado en mi tema personalizado.

La plantilla de bloque es la siguiente:

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

El enlace a la nueva tienda se muestra correctamente, así que supongo que las cosas xml están bien, pero al hacer clic recibo el siguiente error:

section-config.js: 33 TypeError no capturado: no se puede leer la propiedad '*' de undefined (...)

El generado se htmlparece a lo siguiente:

<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
fuente
¿Has ejecutado el comando desplegar y eliminar la carpeta var?
Rakesh Jesadiya
nope XD lo haré y seguiré
davideghz
Acabo de correr sudo php bin/magento setup:static-content:deploysin suerte. ¿Por qué debo eliminar la varcarpeta? ¿Qué debo eliminar exactamente?
davideghz
tienes que eliminar todo el contenido de la carpeta var
Rakesh Jesadiya
1
@davideghz, ¿obtuviste la solución?
Mohammad Mujassam

Respuestas:

14

Tuve el mismo problema y descubrí que estos dos bloques ya no se llamaban debido a personalizaciones en el tema.

Los dos bloques se agregan por defecto en <referenceContainer name="content">vendor / magento / module-customer / view / frontend / layout / default.xml.

Intente volver a agregar estos bloques en su 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
fuente
Tengo el mismo problema pero se representan los bloques. Supongo que es porque estoy en un método requireJs mientras llamo al método de recarga del carrito, pero el JS se ejecuta antes de que se procese el bloque. ¿Puedo depender de cualquier módulo js para evitar esto?
bpoiss
1
Acabo de tener exactamente el mismo problema ... mientras usaba github.com/SnowdogApps/magento2-theme-blank-sass (Magento 2.2.6). Agregar los dos bloques anteriores solucionó el problema. Gracias
giolliano sulit
5

En nuestro proyecto lo arreglamos en el section-config.jsarchivo en el método getAffectedSections(que es donde estaba nuestro error).
Reemplazamos la última línea:

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

Por el siguiente:

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

En realidad, devuelve una matriz vacía cuando ninguna sección se ve afectada.

Flinth
fuente
¿Su solución funciona bien?
Jared Chu
1
Sí, fue una solución funcional, pero IIRC, la raíz real de nuestro problema fue un ligero mal uso de la API de JS al final. No hizo que esta solución fuera irrelevante, sigue siendo una protección para garantizar que el código siga ejecutándose y no se detenga aquí, en casos de error no críticos.
Flinth
1
Gracias, está funcionando ..
Ravi Soni
A mí también me está funcionando. Pero en algunas categorías cuando cambio la vista de la tienda, después de cambiar la vista de la tienda, obtengo una clave de formulario no válida. Actualiza la página. Sin embargo, no hay forma ... Estoy confundido
GG
0

Se encontró con el mismo problema a pesar de que customer.section.configy customer.customer.datase cargaron correctamente en la página.

Sin embargo, en mi caso sucedió porque una extensión intentó activar una recarga de sección demasiado pronto (antes de que se cargara la configuración correcta de la sección).

Logramos resolverlo agregando un punto de interrupción en getAffectedSectionssection-config.js y verificando la variable url. Luego movió la extensión JS para cargar después del bloque 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
fuente
0

En nuestro caso, esto era un poco de código en una plantilla predeterminada que estaba cargando el archivo customer-data.js después de que ya había sido invocado en la página de éxito.

Encontramos el archivo: vendor/magento/module-checkout/view/frontend/templates/success.phtml

estaba cargando este código:

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

La eliminación de este código lo solucionó, lo que hicimos al crear una copia de este archivo en nuestro directorio de plantillas de tema y eliminar el fragmento de código ofensivo.

Puede usar las herramientas de Chrome Dev para averiguar dónde estaba ocurriendo el error y luego, justo antes de ese archivo en su desarrollador local, agregue una console.trace();llamada para establecer qué estaba llamando a la función que arroja el error en la consola. Siga la cadena hasta donde está cargando cosas incorrectamente.

Joshua Fricke
fuente