「section-config.js」でのMagento 2ストアスイッチャーエラーUncaught TypeError:undefined(…)のプロパティ「*」を読み取れません


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:undefined(…)のプロパティ「*」を読み取れません

生成された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>

deployコマンドを実行し、varフォルダーを削除しましたか?
ラケシュジェサディヤ

いいえXD私はそれをやって、フォローアップ
-davideghz

私はsudo php bin/magento setup:static-content:deploy運がなかった。varフォルダーを削除する理由 正確に何を削除する必要がありますか?
davideghz

あなたはvarフォルダのすべてのコンテンツを削除する必要があります
ラケッシュJesadiya

1
@davideghzは解決策を手に入れましたか?
モハマドムジャッサム

回答:


14

私は同じ問題を抱えていましたが、テーマのカスタマイズのためにこれらの2つのブロックが呼び出されなくなったことがわかりました。

2つのブロックは<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"/>

私は同じ問題を抱えていますが、ブロックがレンダリングされます。私は、cart reloadメソッドを呼び出している間にrequireJsメソッドにいるが、ブロックがレンダリングされる前にJSが実行されるためだと思います。これを避けるために、jsモジュールに依存できますか?
bpoiss

1
これとまったく同じ問題が発生しました。github.com/ SnowdogApps / magento2-theme-blank-sass(Magento 2.2.6)を使用しているときに。上記の2つのブロックを追加すると、問題が修正されました。ありがとう
ジョリアーノ・スリット

4

プロジェクトではsection-config.js、メソッド内のファイルで修正しましたgetAffectedSections(エラーが発生した場所です)。
最後の行を置き換えました:

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

次のいずれかによって:

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

セクションに影響がない場合、実際には空の配列を返します。


ソリューションはうまく機能していますか?
ジャレッドチュー

1
はい、機能する回避策でしたが、問題の本当の原因であるIIRCは、最終的にはJS APIのわずかな誤用でした。この修正は無関係ではなく、重大なエラーではない場合でも、コードの実行を継続し、ここで停止しないことを保証するものです。
Flinth

1
おかげで、それは働いている...
ラヴィ曽爾

それも私のために働いています。しかし、一部のカテゴリでは、ストアビューを変更すると、ストアビューが変更された後、無効なフォームキーが取得されます。ページを更新してください。no形式は、私は混乱しています....しかしありません
GG

0

customer.section.configおよびcustomer.customer.dataがページに適切にロードされたにもかかわらず、同じ問題に遭遇しました。

しかし私の場合、拡張機能がセクションリロードを早めにトリガーしようとしたために発生しました(セクションconfig.jsが正しい設定でロードされる前)。

getAffectedSectionssection-config.jsにブレークポイントを追加し、url変数をチェックすることで解決できました。次に、customer.section.configブロックの後にロードする拡張機能JSを移動しました。

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

私たちのケースでは、これは、成功ページで既に呼び出された後に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();呼び出しを追加して、コンソールでエラーをスローしている関数を呼び出しているものを確立できます。チェーンをたどって、物を不適切にロードします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.