Hãy sẵn sàng cho một điều kỳ lạ. Vì vậy, tôi đang tùy chỉnh điều hướng danh mục chính để xây dựng hành vi UI toàn trạng thái xử lý nhiều mô hình tương tác (menu, menu thả xuống, phương thức, v.v.) trên các thiết bị. Giống như bạn làm.
Điều đó có nghĩa là ghi đè lớp / phương thức này:
app/code/core/Mage/Page/Block/Html/Topmenu.php :: _getHtml()
Để tạo đầu ra HTML như thế này (phần nào đơn giản hóa):
<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>
Bây giờ, điều này là khá nhàm chán / tiêu chuẩn ngoại trừ data-ui-action
thuộc tính. Đó là nơi xảy ra phép thuật JS. Bất kỳ nhấp chuột nào vào các yếu tố với thuộc tính đó đều cập nhật trạng thái UI. Bạn đoán nó, li.nav-X
lớp (mà Magento thêm vào) hoạt động như cái móc của tôi để liên kết trạng thái UI với phần tử được kích hoạt.
Tất cả đều tốt, phải không? Bật bộ đệm EE. Tất cả đều tốt phải không? Sai lầm.
Nếu trang bạn đang xem nằm trong hệ thống phân cấp danh mục của Bazeda (aka nav-2
), thì đột nhiên bạn sẽ thấy điều này:
data-ui-action="nav-2 active"
Ai thêm active
chuỗi khó chịu ? Kẻ lừa đảo là ai.
Và bây giờ trạng thái UI của bạn không thành công, vì giá trị của thuộc tính dữ liệu không còn phù hợp với <li>
lớp nữa. Săn lùng bóng ma.
Săn
Trước tiên, bạn kiểm tra xem trong bộ đệm EE, biến
$child->getPositionClass()
đầu ranav-2
không thực sự có các giá trị lớp khác (có lẽ) được nối thêm. Nó không.Bạn kiểm tra xem một trong nhiều tập lệnh JS trang trí của Magento không thực thi trong danh sách điều hướng. Nó không thể.
Có lẽ đó thực sự là một điều kỳ lạ
/js/varien/menu.js
. Nhưng bạn đã loại trừ các tập lệnh cốt lõi như bạn luôn làm.Có lẽ đó là một số JS nội tuyến điên rồ mà bạn không bao giờ biết một mô-đun kết xuất từ lớp PHP. Tìm kiếm nguồn trang
active
trong<script>
thẻ. Bạn không tìm thấy gì.Có thể đó là một số JS Magento điên khùng khác yêu cầu nhưng tải bên ngoài. Bạn vô hiệu hóa JS trong trình duyệt, nhưng cuộc sống ảo.
Bạn quay trở lại
Topmenu.php
lớp học và loại bỏ thuộc tính dữ liệu. Vấn đề dừng lại. Cái quái gì thế.Bạn tự hỏi nếu một thuộc tính khác trên cùng một phần tử không được trích dẫn chính xác (hey, rất nhiều lớp bổ sung xảy ra trong đó). Vì vậy, bạn trao đổi thứ tự của các thuộc tính và loại bỏ chúng trong sự kết hợp khác nhau. Không có con xúc xắc. Nếu thuộc tính dữ liệu có mặt, thì bóng ma cũng vậy.
Bạn tự hỏi nếu không phải lớp PHP này đang thực hiện thì sao? Có một
page_block_html_topmenu_gethtml_after
sự kiện được gửi đi một cái gì đó khác có thể sử dụng để hack đánh dấu từ bên ngoài. Không có gì.Gì. Là. Đang xảy ra. Đây.
Câu trả lời
Giải thích tất cả những điều đó cho các nhà phát triển phụ trợ. Mọi người hành động bối rối. Cho đến khi ...