팬텀 내비게이션 데코레이터의 흥미로운 사례로 마젠 토의 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-XMagento가 추가 한 클래스는 UI 상태를 활성화 된 요소에 바인딩하는 내 후크 역할을합니다.

다 괜찮아? EE 캐시를 켭니다. 괜찮아? 잘못된.

보고있는 페이지가 Bazinga (일명 nav-2) 의 카탈로그 계층 구조 내에 있으면 갑자기 다음과 같이 표시됩니다.

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

불쾌한 active줄을 누가 추가 했습니까? 팬텀은 누구입니다.

데이터 속성의 값이 <li>더 이상 클래스 와 일치하지 않으므로 UI ​​상태가 실패합니다 . 팬텀을 사냥하십시오.

사냥

  1. 먼저, EE 캐시에서 $child->getPositionClass()출력에 nav-2실제로 다른 클래스 값이 추가되지 않은 변수를 확인하십시오 . 그렇지 않습니다.

  2. Magento의 많은 데코레이터 JS 스크립트 중 하나가 탐색 목록에서 실행되고 있지 않은지 확인하십시오. 그렇지 않습니다.

  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
"굉장한"문제와 설명!
Anna Völkl

haha wow 그것은 실제로 꽤 미쳤다 ... 전체 페이지 캐시 모듈의 모델에서 ... upvoted
Erfan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.