MagentoのEEキャッシュに印象的なファントムナビゲーションデコレータの奇妙なケース


12

変なものの準備をしなさい。そのため、プライマリカタログナビゲーションをカスタマイズして、デバイス全体で複数の対話モデル(メニュー、ドロップダウン、モーダルなど)を処理するステートフルUI動作を構築しています。あなたのように。

つまり、このクラス/メソッドをオーバーライドします。

app/code/core/Mage/Page/Block/Html/Topmenu.php :: _getHtml()

このようなHTML出力を生成するには(多少簡略化):

<ul class="nav-list">
    <li class="nav-1">
        <a data-ui-action="nav-1" href="#">Bazzow</a>
        <div class="menu"> ... </div>
    </li>

    <li class="nav-2">
        <a data-ui-action="nav-2" href="#">Bazinga</a>
        <div class="menu"> ... </div>
    </li>
</ul>

さて、これはdata-ui-action属性を除いてかなり退屈/標準です。そこでJSの魔法が起こります。その属性を持つ要素をクリックすると、UIの状態が更新されます。ごli.nav-X想像のとおり、クラス(Magentoが追加)は、UI状態をアクティブ化された要素にバインドするためのフックとして機能します。

いいですね EEキャッシュをオンにします。いいですか?違う。

表示しているページがBazinga(別名nav-2)のカタログ階層内にある場合、突然次のように表示されます。

data-ui-action="nav-2 active"

不快なactive文字列を追加したのは誰ですか?幻は誰です。

そして、データ属性の値が<li>クラスと一致しなくなったため、UI状態が失敗します。ファントムを追い詰める。

狩り

  1. 最初に、EEキャッシュの下$child->getPositionClass()で、出力nav-2に実際に他の(おそらく)クラス値が追加されていないことを確認します。ありません。

  2. Magentoの多くのデコレータJSスクリプトの1つがnavリストで実行されていないことを確認します。そうではありません。

  3. たぶんそれは実際にはの奇妙なことでしょう/js/varien/menu.js。ただし、いつものように、これらのコアスクリプトは既に除外されています。

  4. たぶん、モジュールがPHPクラスからレンダリングされるとは決して知らない、クレイジーなインラインJSかもしれません。タグactive内でページソースを検索します<script>。何も見つかりません。

  5. たぶん、JS Magentoが必要とするが外部からロードする他のクレイジーなものかもしれません。ブラウザでJSを無効にしますが、ファントムは存続します。

  6. Topmenu.phpクラスに戻り、データ属性を削除します。問題は停止します。なんてこったい。

  7. 同じ要素の別の属性が適切に引用符で閉じられていないのではないかと思います(クラスの追加が多く発生します)。そのため、属性の順序を入れ替えて、さまざまな組み合わせで削除します。サイコロなし。データ属性が存在する場合、ファントムも存在します。

  8. この PHPクラスが行動を起こさないとしたらどうでしょうか。page_block_html_topmenu_gethtml_afterマークアップを超えてハックするために他の何かが使用する可能性のあるディスパッチイベントがあります。なし。

  9. 何。です ハプニング。ここに。

答え

すべてのことをバックエンド開発者に説明してください。誰もが混乱して行動します。まで...

回答:


10

誰かがひび割れます:

app/code/core/Enterprise/PageCache/Model/Container/Catalognavigation.php
Method: saveCache()
Line 107

厄介な小さな正規表現が表示されます。

if (preg_match('/(?<=\s|^)nav-.+?(?=\s|$)/', $classValue, $matches)) {
    $categoryUniqueClasses .= ($categoryUniqueClasses ? ' ' : '') . $matches[0];
}

これはnav-この中で悪魔と一致しています<li>。覚えておいてください:

<li class="nav-1">
    <a data-ui-action="nav-1" href="#">Bazzow</a>
    <div class="menu"> ... </div>
</li>

Magentoは要素のnav-文字列のみを検出することを期待して<li>いますが、データ属性の値は一致し、ハッキングされています。欲しくない。

そのため、などの異なるクラスとデータ属性を使用しますi-have-a-child-

ファントム

本物の男が自分の運を作る、ビリー・ゼーン。


1
「素晴らしい」問題と説明!
アンナフォルクル

ハハワオ、実際にはかなりクレイジーです...全ページキャッシュモジュールのモデルで...賛成
Erfan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.