Kasus aneh dari dekorator navigasi hantu mencolok cache EE Magento

12

Bersiaplah untuk yang aneh. Jadi saya menyesuaikan navigasi katalog utama untuk membangun perilaku UI keadaan penuh yang menangani beberapa model interaksi (menu, dropdown, modals, dll) di seluruh perangkat. Seperti yang kamu lakukan.

Itu berarti mengganti kelas / metode ini:

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

Untuk menghasilkan output HTML seperti ini (agak disederhanakan):

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

Sekarang, ini cukup membosankan / standar kecuali untuk data-ui-actionatributnya. Di situlah keajaiban JS terjadi. Setiap klik pada elemen dengan atribut itu akan memperbarui keadaan UI. Anda dapat menebaknya, li.nav-Xkelas (yang ditambahkan Magento) bertindak sebagai pengait saya untuk mengikat keadaan UI ke elemen yang diaktifkan.

Semua baik-baik saja, kan? Nyalakan cache EE. Baik baik saja Salah.

Jika halaman yang Anda lihat berada dalam hierarki katalog Bazinga (alias nav-2), maka tiba-tiba Anda akan melihat ini:

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

Siapa yang menambahkan activestring jahat ? Hantu adalah siapa.

Dan sekarang keadaan UI Anda gagal, karena nilai atribut data tidak cocok dengan <li>kelas lagi. Memburu hantu.

Perburuan

  1. Pertama, Anda memeriksa bahwa di bawah EE cache variabel $child->getPositionClass()yang keluarannya nav-2tidak benar-benar memiliki nilai kelas lain (mungkin) ditambahkan. Itu tidak.

  2. Anda memeriksa bahwa salah satu dari banyak skrip JS dekorator Magento tidak dieksekusi pada daftar nav. Ini bukan.

  3. Mungkin itu sebenarnya beberapa hal aneh /js/varien/menu.js. Tetapi Anda sudah mengecualikan script inti seperti yang selalu Anda lakukan.

  4. Mungkin itu beberapa JS inline gila yang Anda tidak akan pernah tahu modul merender keluar dari kelas PHP. Cari sumber halaman di activedalam <script>tag. Anda tidak menemukan apa pun.

  5. Mungkin ini memerlukan beberapa JS Magento gila lainnya tetapi memuat secara eksternal. Anda menonaktifkan JS di browser, tetapi hantu tetap hidup.

  6. Anda kembali ke Topmenu.phpkelas Anda dan menghapus atribut data. Masalahnya berhenti. Apa apaan.

  7. Anda bertanya-tanya apakah atribut lain pada elemen yang sama tidak benar kutipan-ditutup (hei, banyak penambahan kelas terjadi di sana). Jadi, Anda menukar urutan atribut dan menghapusnya dalam berbagai kombinasi. Tidak ada dadu. Jika atribut data ada, begitu juga hantu.

  8. Anda bertanya-tanya bagaimana jika bukan kelas PHP ini yang melakukan perbuatan itu? Ada page_block_html_topmenu_gethtml_afteracara yang dikirimkan oleh orang lain untuk meretas markup dari luar. Tidak ada.

  9. Apa. Adalah. Kejadian. Sini.

Jawabannya

Jelaskan semua itu kepada para pengembang backend. Semua orang bertindak bingung. Sampai...

Brendan Falkowski
sumber

Jawaban:

10

Seseorang retak terbuka:

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

Anda melihat ekspresi reguler kecil yang tidak menyenangkan:

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

Yang cocok dengan iblis untuk nav-ini <li>. Hanya agar Anda ingat:

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

Magento berharap hanya menemukan nav-string pada <li>elemen, tetapi nilai atribut data Anda semakin cocok dan diretas. Tidak ingin.

Jadi gunakan atribut kelas dan data yang berbeda seperti i-have-a-child-.

The Phantom

Pria sejati membuat keberuntungannya sendiri, Billy Zane.

Brendan Falkowski
sumber
1
Masalah dan penjelasan "Luar Biasa"!
Anna Völkl
haha wow itu sebenarnya cukup gila ... Dalam model modul cache halaman penuh ... terbalik
Erfan