Magento'nun EE önbelleğine çarpan fantom navigasyon dekoratörünün meraklı vakası


12

Tuhaf birine hazır olun. Bu yüzden, aygıtlar arasında birden çok etkileşim modelini (menüler, açılır listeler, modüller, vb.) Ele alan durumla dolu bir kullanıcı arayüzü davranışı oluşturmak için birincil katalog gezinmesini özelleştiriyorum. Senin yaptığın gibi.

Bu, bu sınıfı / yöntemi geçersiz kılmak anlamına gelir:

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

Bunun gibi HTML çıktısı üretmek için (biraz basitleştirilmiş):

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

Şimdi, bu data-ui-actionözellik dışında oldukça sıkıcı / standarttır . JS büyüsü burada gerçekleşir. Bu özelliğe sahip öğelere yapılan tüm tıklamalar UI durumunu günceller. Bunu tahmin ettiniz, li.nav-X(Magento'nun eklediği) sınıf, UI durumunu etkinleştirilmiş öğeye bağlamak için kancam gibi davranıyor.

Her şey yolunda, değil mi? EE önbelleğini açın. İyi değil mi? Yanlış.

Görüntülediğiniz sayfa Bazinga (aka nav-2) katalog hiyerarşisindeyse, birdenbire bunu görürsünüz:

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

Kötü activeipi kim ekledi ? Hayalet kimdir.

Artık veri özelliğinin değeri <li>artık sınıfla eşleşmediğinden, kullanıcı arayüzü durumunuz başarısız oluyor . Hayaleti avla.

Av

  1. İlk olarak, EE önbelleği altında $child->getPositionClass()çıktı değişkeninin nav-2aslında başka (muhtemelen) sınıf değerlerinin eklenmediğini kontrol edersiniz . O değil.

  2. Magento'nun birçok dekoratör JS komut dosyasından birinin gezinme listesinde yürütülmediğini kontrol edersiniz. Değil.

  3. Belki de aslında tuhaf bir şey /js/varien/menu.js. Ama bu temel komut dosyalarını her zaman yaptığınız gibi zaten hariç tuttunuz.

  4. Belki de bir modül PHP sınıfından render asla bilemezsiniz bazı deli satır içi JS. Sayfa kaynağında etiketler activeiçinde arama yapın <script>. Hiçbir şey bulamazsın.

  5. Belki JS Magento'nun gerektirdiği diğer çılgınca ama dışarıdan yükler. Tarayıcıda JS'yi devre dışı bıraktınız, ancak fantom yaşıyor.

  6. Topmenu.phpSınıfınıza geri dönersiniz ve veri özniteliğini kaldırırsınız. Sorun duruyor. Ne oluyor be.

  7. Aynı öğedeki başka bir özniteliğin uygun şekilde alıntı yapılıp kapanmadığını merak ediyorsunuz (hey, orada çok sayıda sınıf ekleniyor). Böylece özniteliklerin sırasını değiştirir ve bunları çeşitli kombinasyonlarda kaldırırsınız. Nafile. Veri özniteliği varsa, hayalet de öyledir.

  8. Acaba bu PHP sınıfı senet yapmıyorsa? page_block_html_topmenu_gethtml_afterİşaretlemeyi aşmak için başka bir şeyin kullanabileceği gönderilmiş bir olay var. Hiçbir şey değil.

  9. Ne. Dır-dir. Olay. Buraya.

Cevap

Tüm bunları arka uç geliştiricilere açıklayın. Herkes şaşkın davranır. A kadar...

Yanıtlar:


10

Birisi açık çatlaklar:

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

Küçük, kötü bir ifade görürsünüz:

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

Hangi için bazı şeytanlık eşleştirme nav-bu dahilinde <li>. Hatırlamanız için:

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

Magento yalnızca öğeler nav-üzerinde dizeler bulmayı bekliyor <li>, ancak veri özelliğinizin değeri eşleştiriliyor ve saldırıya uğratılıyor. İstemiyorum.

Yani farklı bir sınıf ve veri özniteliği kullanın i-have-a-child-.

Hayalet

Gerçek bir adam kendi şansını yapar, Billy Zane.


1
"Harika" sorun ve açıklama!
Anna Völkl

haha wow bu gerçekten çılgınca ... Tam sayfa önbellek modülünün bir modelinde ... kaldırıldı
Erfan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.