Magento के 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विशेषता के अलावा बहुत उबाऊ / मानक है । बस यहीं से जेएस मैजिक होता है। उस विशेषता वाले तत्वों पर कोई भी क्लिक यूआई स्थिति को अपडेट करता है। आपने यह अनुमान लगाया, li.nav-Xवर्ग (जो Magento जोड़ता है) UI को सक्रिय तत्व में बाँधने के लिए मेरे हुक के रूप में कार्य करता है।

सब अच्छा है, है ना? EE कैश चालू करें। सब ठीक है? गलत।

यदि आप जो पृष्ठ देख रहे हैं, वह बेज़िंगा (उर्फ nav-2) की सूची पदानुक्रम के भीतर है , तो अचानक आपको यह दिखाई देगा:

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

गंदा activeतार किसने जोड़ा ? प्रेत कौन है।

और अब आपका UI स्थिति विफल हो जाता है, क्योंकि डेटा विशेषता का मान <li>वर्ग से मेल नहीं खाता है । प्रेत का शिकार करें।

शिकार

  1. सबसे पहले, आप जांचते हैं कि ईई कैश के तहत चर $child->getPositionClass()जो आउटपुट nav-2वास्तव में अन्य (संभवतया) वर्ग मानों में संलग्न नहीं है। ऐसा नहीं होता।

  2. आप जाँचते हैं कि मैगेंटो के कई डेकोरेटर जेएस स्क्रिप्ट्स में से एक भी नेवी लिस्ट में नहीं है। यह।

  3. शायद यह वास्तव में कुछ अजीब बात है /js/varien/menu.js। लेकिन आपने पहले से ही उन मुख्य लिपियों को बाहर रखा है जैसे आप हमेशा करते हैं।

  4. शायद यह कुछ पागल इनलाइन जेएस है जिसे आप कभी नहीं जान पाएंगे कि एक मॉड्यूल PHP क्लास से बाहर निकलता है। के लिए पृष्ठ का स्रोत खोजें activeभीतर <script>टैग। आप कुछ नहीं पाते हैं।

  5. शायद यह कुछ अन्य पागल जे एस Magento की आवश्यकता है, लेकिन बाहरी रूप से लोड होता है। आप जेएस को ब्राउज़र में अक्षम करते हैं, लेकिन प्रेत रहता है।

  6. आप अपनी Topmenu.phpकक्षा में वापस जाते हैं और डेटा विशेषता को निकालते हैं। समस्या बंद हो जाती है। क्या बकवास है।

  7. आपको आश्चर्य होता है कि एक ही तत्व पर एक अन्य विशेषता ठीक से बोली-बंद नहीं है (अरे, बहुत सारे क्लास अपग्रेडिंग होते हैं)। तो आप विशेषताओं के क्रम को स्वैप करते हैं और उन्हें विभिन्न संयोजन में निकालते हैं। कोई पाँसा नहीं। यदि डेटा विशेषता मौजूद है, तो प्रेत है।

  8. आप क्या यह नहीं कर रहा है, तो आश्चर्य इस कार्य कर पीएचपी वर्ग? एक प्रेषण 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>

मैगेंटो केवल तत्वों nav-पर तार खोजने की उम्मीद कर रहा है <li>, लेकिन आपके डेटा विशेषता का मूल्य मिलान और हैक किया जा रहा है। नहीं चाहिए।

इसलिए एक अलग वर्ग और डेटा विशेषता का उपयोग करें i-have-a-child-।

प्रेत

एक असली आदमी अपनी किस्मत, बिली ज़ेन बनाता है।


1
"भयानक" समस्या और स्पष्टीकरण!
— अन्ना वोक्कल

हाहा वाह यह वास्तव में बहुत पागल है ... पूर्ण पृष्ठ कैश मॉड्यूल के एक मॉडल में ... upvoted
— Erfan
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.