MODX क्रांति - असामान्य स्थितियों के लिए बैसाखी की एक जोड़ी

MODX बेशक एक शांत सीएमएफ है, लेकिन कभी-कभी आपको ऐसे ट्रिफ़ल्स के साथ पकड़ना पड़ता है जो तनाव करते हैं। मैं इस विषय में नहीं रोऊंगा कि चारों ओर क्या बुरा है, लेकिन मैं बहुत अच्छा हूं। उदाहरण के लिए, क्रांति शाखा को लें और इसे विच्छेदित करें। और ताकि आप इस लेख में रुचि न खोएं, यहां लेख की संक्षिप्त रूपरेखा है:
  1. बैकेंड पार्सिंग
  2. सेटिंग्स में गहरा होना
  3. नेस्टेड चंक्स के साथ काम करें
  4. हम पार्सर के काम का निरीक्षण करते हैं
  5. शक्तिशाली कैश



एक पैरामीटर सेट से एक पैरामीटर को हटाना


मापदंडों का एक सेट बनाएँ। हम इसमें एक्स पैरामीटर जोड़ते हैं, और फिर हम समझते हैं कि हमने भाग लिया था। डिलीट बटन ढूंढने की कोशिश ...

सामान्य तौर पर, मुझे कुछ भी नहीं आया। मुझे पैरामीटर निकालने के लिए एक और तरीका तलाशना था।
समाधान : हम संपादन के लिए एक अनावश्यक पैरामीटर खोलते हैं और दूसरे आवश्यक पैरामीटर के सभी डेटा को पूरी तरह से कॉपी करते हैं (माना जाता है कि नए डेटा के साथ पुराने पैरामीटर को अधिलेखित करने की कोशिश कर रहा है)।
कोरोलरी: हम वांछित पैरामीटर के मान को ओवरराइट कर सकते हैं।

संदर्भ सेटिंग्स में मुख्य मूल्य


हम इस स्थिति का अनुकरण करेंगे: कई संदर्भ, प्रत्येक सेटिंग की अपनी सेटिंग्स होती हैं।
यदि व्यवस्थापक पैनल में कई साइटें हैं, तो, एक नियम के रूप में, एक साइट जैसे कि site_name को संदर्भ सेटिंग्स में पुन: परिभाषित किया गया है। अब कल्पना कीजिए, आपकी कंपनी ने हमेशा कूल पेपर्स के रूप में अपना नाम रखा है।

आप क्या सोचते हैं, आगे के अंत में हम क्या परिणाम देखेंगे? सही है, बस कूल।
समाधान : कोष्ठक के बजाय विशेष वर्णों का उपयोग करें।
और उन लोगों के बारे में क्या है जो कई संदर्भों में 1 टेम्पलेट का उपयोग करते हैं और एक कुंजी के रूप में जेएस कोड के लिए मापदंडों का एक निश्चित सेट निर्दिष्ट करना चाहते हैं? वहां, विशेष वर्ण मदद नहीं करेंगे और एक हिस्सा नहीं कर सकता।
पहले से ही दो समाधान हैं
  • पहला समाधान : अपना स्वयं का स्निपेट बनाएं और संदर्भ के आधार पर, getChunk का उपयोग करके वांछित हिस्सा दें।
  • दूसरा समाधान : प्रत्येक संदर्भ के लिए, अपना स्वयं का हिस्सा बनाएं और कुंजी के बजाय टेम्पलेट में [[$ नाम _ [[* संदर्भ_की]]]] लिखें। लेकिन हो सकता है कि जैसा भी हो, यह रिकॉर्ड धुन से बाहर दिखता है ... इस समाधान के लिए धन्यवाद


नेस्टेड चंक्स के साथ काम करें


MODX में लंबे समय से एक विशेषता है
getChunk
(parseChunk, उदाहरण के लिए, इस पर निर्भर करता है)।
public function getChunk($chunkName, array $properties= array ()) { $output= ''; if (array_key_exists($chunkName, $this->sourceCache['modChunk'])) { $chunk = $this->newObject('modChunk'); $chunk->fromArray($this->sourceCache['modChunk'][$chunkName]['fields'], '', true, true); $chunk->setPolicies($this->sourceCache['modChunk'][$chunkName]['policies']); } else { $chunk= $this->getObject('modChunk', array ('name' => $chunkName), true); if (!empty($chunk) || $chunk === '0') { $this->sourceCache['modChunk'][$chunkName]= array ( 'fields' => $chunk->toArray(), 'policies' => $chunk->getPolicies() ); } } if (!empty($chunk) || $chunk === '0') { $chunk->setCacheable(false); $output= $chunk->process($properties); } return $output; } 


अब एक simple बनाते है
टुकड़ा
 <?php ini_set("display_errors",1); $data=''; $phs=isset($phs)?explode(",",$phs):array(); if(isset($tpl,$phs) && $tpl!='' && count($phs)>0){ foreach($phs as $item){ $data.=$modx->parseChunk($tpl,array('item'=>$item,'time'=>time())); } } return $data; 


phpthumbof स्थापित करें और बनाएं
टुकड़ा
 <p><b>[[+time]]</b>: [[+item]] - [[!phpthumbof? &input=`[[+item]]` &options=`&h=150&f=jpg`]]</p> 


आइए इस पेज पर सभी को इस तरह से कॉल करें: [[!test? &tpl=`test` &phs=`/assets/1.jpg,/assets/2.jpg`]] [[!test? &tpl=`test` &phs=`/assets/1.jpg,/assets/2.jpg`]]
लेकिन यह बुरी किस्मत है, पहली बार phpthumbof स्निपेट को कहा जाता है, स्ट्रिंग [[+ आइटम]] में आता है, और केवल बाद के सभी लोगों के साथ पहले से ही रखा प्लेसहोल्डर है

समाधान : इस तरह की समस्याग्रस्त फाइलों को स्टोर करें। यानी स्टैटिक बॉक्स को चेक करें और फाइल को चुनें

एक और bezumkin समाधान : getChunk के साथ parseChunk को बदलें।

हम पार्सर के काम का निरीक्षण करते हैं


हम निम्नानुसार प्रयोग करेंगे: रिक्त टेम्पलेट के साथ एक नया दस्तावेज़ बनाएं। हम सामग्री और बाकी सब कुछ खाली छोड़ देते हैं। जांचें कि चेकबॉक्स कैशिंग के लायक है।
अब फ़ाइल /core /mode/modx/modparser.class.pp से processElementTags फ़ंक्शन खोलें
 public function processElementTags($parentTag, & $content, $processUncacheable= false, $removeUnprocessed= false, $prefix= "[[", $suffix= "]]", $tokens= array (), $depth= 0) { $this->_processingTag = true; $this->_processingUncacheable = (boolean) $processUncacheable; $this->_removingUnprocessed = (boolean) $removeUnprocessed; $depth = $depth > 0 ? $depth - 1 : 0; $processed= 0; $tags= array (); /* invoke OnParseDocument event */ $this->modx->documentOutput = $content; $this->modx->invokeEvent('OnParseDocument', array('content' => &$content)); $content = $this->modx->documentOutput; unset($this->modx->documentOutput); if ($collected= $this->collectElementTags($content, $tags, $prefix, $suffix, $tokens)) { $tagMap= array (); foreach ($tags as $tag) { $token= substr($tag[1], 0, 1); if (!$processUncacheable && $token === '!') { if ($removeUnprocessed) { $tagMap[$tag[0]]= ''; } } elseif (!empty ($tokens) && !in_array($token, $tokens)) { $collected--; continue; } if ($tag[0] === $parentTag) { $tagMap[$tag[0]]= ''; $processed++; continue; } $tagOutput= $this->processTag($tag, $processUncacheable); if (($tagOutput === null || $tagOutput === false) && $removeUnprocessed) { $tagMap[$tag[0]]= ''; $processed++; } elseif ($tagOutput !== null && $tagOutput !== false) { $tagMap[$tag[0]]= $tagOutput; if ($tag[0] !== $tagOutput) $processed++; } } $this->mergeTagOutput($tagMap, $content); if ($depth > 0) { $processed+= $this->processElementTags($parentTag, $content, $processUncacheable, $removeUnprocessed, $prefix, $suffix, $tokens, $depth); } } $this->_processingTag = false; return $processed; } 


लाइन से पहले
 $this->_processingTag = true; 
जोड़ना
 static $test; echo ++$test."<br />"; 

खैर, ब्राउज़र में हमारे पेज को खोलें। G0! नंबर 1..2..3 सवाल यह है कि कौन सी माँ आपकी है ... खाली पृष्ठ। पार्स करने के लिए क्या है? हम स्रोत को ध्यान से देखते हैं
 $this->modx->invokeEvent('OnParseDocument', array('content' => &$content)); 

इस प्रकार, एक रिक्त पृष्ठ पर भी, हम एक ही घटना को 3 बार ट्रिगर करते हैं। मैं यह सोचकर डर गया कि उन साइटों का क्या होगा जो अभी भी इस घटना पर कुछ कोड लटकाए हुए हैं।
प्रयोग के लिए artdevue की जाँच की गई कि कितनी बार इस फ़ंक्शन को विभिन्न परिस्थितियों में निष्पादित किया जाएगा। इसलिए हमारे पास निम्नलिखित प्लेट है।
शर्तपुनरावृत्तियों
[[स्निपेट]]2
{{$ चंकू}}2
खाली पृष्ठ3
[[संख्या? इनपुट = `1000`]]5
[[* पगेटिटेल: अंक]]6
[[संख्या; इनपुट = `[[* पेजेटीटल]] []7
कोई भी नहीं स्निपेट23
कोई भी नहीं23


शक्तिशाली कैश


कार्यशील साइटों में से एक पर मैंने कैश के साथ एक फ़ोल्डर खोला और लगभग एक कुर्सी से गिर गया। कैश में 1 पेज 50 से 200 केबी का होता है। नहीं, यह बेशक सामान्य हो सकता है, लेकिन हर बार दस्तावेज़ बदले जाने पर कैश अपडेट हो जाता है। अपडेट किया गया 1 दस्तावेज़ - सभी कैश्ड पृष्ठ हटा दिए गए हैं। और अगर 100 पेज? 1000? यह कुछ एमबी खींच रहा है। अगर हर दिन खबर को जोड़ा जाए तो क्या होगा?

पीएस ने इस विषय का नाम बदलकर कम विकराल और रूपवान बना दिया

Source: https://habr.com/ru/post/In153261/


All Articles