Ошибка переключателя магазина Magento 2 в «section-config.js». Uncaught TypeError: Невозможно прочитать свойство '*' из неопределенного (…)

12

Я реализую пользовательский переключатель магазина в своей пользовательской теме.

Шаблон блока выглядит следующим образом:

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

Ссылка на новый магазин отображается правильно, поэтому я думаю, что с XML все в порядке, но при нажатии я получаю следующую ошибку:

section-config.js: 33 Uncaught TypeError: Невозможно прочитать свойство '*' из неопределенного (…)

Сгенерированный htmlвыглядит следующим образом:

<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
источник
Вы запускаете команду deploy и удаляете папку var?
Ракеш Джесадия
Нету XD Я сделаю это и
продолжу
Я просто бежал sudo php bin/magento setup:static-content:deployбез удачи. Почему я должен удалить varпапку? Что именно я должен удалить?
Давидегз
Вы должны удалить все содержимое папки var
Ракеш Джесадия
1
@ davideghz вы получили решение?
Мохаммад Муджассам

Ответы:

14

У меня была та же проблема, и я обнаружил, что эти два блока больше не называются из-за настроек в теме.

Эти два блока по умолчанию добавляются в <referenceContainer name="content">файл vendor / magento / module-customer / view / frontend / layout / default.xml.

Попробуйте заново добавить эти блоки в файл 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"/>
Анна Фёлькл
источник
У меня та же проблема, но блоки отображаются. Я предполагаю, что это потому, что я нахожусь в методе requireJs при вызове метода перезагрузки корзины, но JS выполняется до визуализации блока. Могу ли я зависеть от любого js-модуля, чтобы избежать этого?
bpoiss
1
Просто была такая же проблема .. при использовании github.com/SnowdogApps/magento2-theme-blank-sass (Magento 2.2.6). Добавление двух вышеупомянутых блоков решило проблему. Спасибо
Джулиано Сулит
5

В нашем проекте мы исправили это в section-config.jsфайле метода getAffectedSections(где и была наша ошибка).
Мы заменили последнюю строку:

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

По следующему:

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

На самом деле возвращает пустой массив, когда ни один раздел не затронут.

Flinth
источник
Ваше решение работает хорошо?
Джаред Чу
1
Да, это был функциональный обходной путь, но IIRC, реальный корень нашей проблемы, заключался в небольшом неправильном использовании JS API. Это не сделало это исправление нерелевантным, оно все еще является защитой, гарантирующей, что код продолжает работать и не останавливается здесь, в случаях не критических ошибок.
Flinth
1
Спасибо, это работает ..
Рави Сони
Это работает и для меня. Но в некоторых категориях, когда я меняю представление магазина, после изменения вида магазина я получаю неверный ключ формы. Пожалуйста, обновите страницу. Никакой формы там нет ... Я в замешательстве
Г.Г.
0

Наткнулся на ту же проблему, хотя customer.section.configи customer.customer.dataбыли правильно загружены на страницу.

Однако в моем случае это произошло из-за того, что расширение попыталось инициировать перезагрузку раздела слишком рано (до того, как файл section-config.js был загружен с правильной конфигурацией).

getAffectedSectionsРешил ее, добавив точку останова в section-config.js и проверив переменную url. Затем переместил расширение JS для загрузки после блока 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
источник
0

В нашем случае это было немного кода в шаблоне по умолчанию, который загружал файл customer-data.js после того, как он уже был вызван на странице успеха.

Мы нашли файл: vendor/magento/module-checkout/view/frontend/templates/success.phtml

загружал этот код:

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

Удаление этого кода исправило это, что мы и сделали, создав копию этого файла в каталоге шаблонов тем и удалив фрагмент кода, который нарушил работу.

Вы можете использовать инструменты Chrome Dev, чтобы узнать, где произошла ошибка, а затем непосредственно перед тем, как в этом файле в вашем локальном dev добавить console.trace();вызов, чтобы установить, что вызывало функцию, которая выдает ошибку в консоли. Следуйте по цепочке туда, куда вы загружаете вещи ненадлежащим образом.

Джошуа Фрике
источник