กรณีที่อยากรู้อยากเห็นของมัณฑนากรตกแต่งภาพนำทางที่โดดเด่น EE cache ของ Magento


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คลาส (ซึ่งวีโอไอพีเพิ่ม) ทำหน้าที่เป็นตะขอของฉันในการผูกสถานะ UI กับองค์ประกอบที่เปิดใช้งาน

ดีเลยใช่มั้ย เปิดแคช EE ถูกต้องหรือไม่ ไม่ถูกต้อง.

หากหน้าเว็บที่คุณกำลังดูอยู่ในลำดับชั้นของแคตตาล็อกของBazinga (aka nav-2) ทันใดนั้นคุณจะเห็นสิ่งนี้:

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

ใครเพิ่มactiveสตริงที่น่ารังเกียจ? แฟนคือใคร

และตอนนี้สถานะ UI ของคุณล้มเหลวเนื่องจากค่าของแอตทริบิวต์ข้อมูลไม่ตรงกับ<li>คลาสอีกต่อไป ตามล่าปีศาจ

การตามล่า

  1. ก่อนอื่นคุณตรวจสอบว่าภายใต้ EE cache ตัวแปร$child->getPositionClass()ที่เอาท์พุทnav-2ไม่ได้มีค่าต่อท้ายอื่น ๆ (สมมุติ) อื่น ๆ มันไม่ใช่.

  2. คุณตรวจสอบว่าหนึ่งในสคริปต์ JS ของมัณฑนากรหลายตัวของ Magento ไม่ได้ทำงานในรายการ nav มันไม่ใช่.

  3. /js/varien/menu.jsบางทีมันอาจจะเป็นจริงบางสิ่งที่แปลกใน แต่คุณได้ยกเว้นสคริปต์หลักเหล่านั้นอย่างที่คุณเคยทำ

  4. บางที JS แบบอินไลน์บ้า ๆ บอ ๆ ที่คุณไม่มีทางรู้ว่าโมดูลแสดงผลออกมาจากคลาส PHP ค้นหาแหล่งที่มาของหน้าactiveภายใน<script>แท็ก คุณไม่พบอะไรเลย

  5. บางทีมันอาจเป็นบางสิ่งที่ JS Magento ที่บ้าคลั่ง แต่ต้องการโหลดจากภายนอก คุณปิดการใช้งาน JS ในเบราว์เซอร์ แต่ผียังมีชีวิตอยู่

  6. คุณกลับไปที่Topmenu.phpชั้นเรียนของคุณและลบข้อมูลคุณลักษณะ ปัญหาหยุดลง สิ่งที่นรก

  7. คุณสงสัยว่าคุณลักษณะอื่นในองค์ประกอบเดียวกันนั้นไม่ได้ปิดการอ้างอย่างถูกต้องหรือไม่ (เฮ้มีการต่อท้ายคลาสจำนวนมากเกิดขึ้นที่นั่น) ดังนั้นคุณจะต้องสลับลำดับของคุณลักษณะและลบออกเป็นชุดต่างๆ ไม่มีลูกเต๋า หากแอตทริบิวต์ data มีอยู่ดังนั้นจึงเป็น phantom

  8. คุณสงสัยไหมว่าถ้าไม่ใช่คลาส PHP ตัวนี้จะทำอย่างไร มีpage_block_html_topmenu_gethtml_afterกิจกรรมที่ถูกจัดส่งอย่างอื่นที่อาจใช้เพื่อแฮ็กอัปมาร์คอัปจากที่อื่น ๆ ไม่มีอะไร

  9. อะไร. คือ. สิ่งที่เกิดขึ้น ที่นี่

คำตอบ

อธิบายทุกสิ่งที่ devs แบ็กเอนด์ ทุกคนแสดงความสับสน จนกระทั่ง ...

คำตอบ:


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];
}

ซึ่งคือการจับคู่ Devilry บางอย่างสำหรับภายในนี้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-ดังนั้นการใช้ระดับที่แตกต่างและข้อมูลแอตทริบิวต์เช่น

เดอะแฟนธ่อม

ผู้ชายที่แท้จริงทำให้โชคของเขาเอง Billy Zane


1
ปัญหาและคำอธิบาย "ดีเลิศ"!
Anna Völkl

ฮ่าฮ่าว้าวจริง ๆ แล้วมันค่อนข้างบ้า ... ในรูปแบบของโมดูลแคชแบบเต็มหน้า ... upvoted
Erfan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.