MODX Revolution-異常な状況に対応する松葉杖のペア

MODXはもちろんクールなCMFですが、時にはそのような些細なことで緊張することもあります。 このトピックでは、周りの何が悪いのかは泣きませんが、私はとても良いです。 たとえば、Revolutionブランチを分析します。 この記事への関心を失わないように、記事の簡単な概要を以下に示します。

  1. バックエンド解析
  2. 設定の深化
  3. ネストされたチャンクを使用する
  4. パーサーの動作を観察します
  5. 強力なキャッシュ






パラメーターセットからパラメーターを削除する



パラメータのセットを作成します。 Xパラメータを追加すると、別れたことがわかります。 削除ボタンを見つけようとしています...



一般に、私からは何も来ませんでした。 パラメータを削除する別の方法を探す必要がありました。

解決策 :不要なパラメーターを編集用に開き、他の目的のパラメーターのすべてのデータを完全にコピーします(古いパラメーターを新しいデータで上書きしようとしている場合)。

結果:目的のパラメーターの値を上書きできます。



コンテキスト設定のキー値



この状況をシミュレートします。複数のコンテキスト、各設定には独自の設定があります。

管理パネルに複数のサイトがある場合、原則として、site_nameなどのキーがコンテキスト設定で再定義されます。 想像してみてください。あなたの会社は常にその名前をCool Peppersと呼んでいます。



フロントエンドでどのような結果が得られると思いますか? まさにクール。

解決策 :括弧の代わりに特殊文字を使用します。

そして、いくつかのコンテキストで1つのテンプレートを使用し、JSコードの特定のパラメーターセットをキーとして指定したい人はどうでしょうか。 そこでは、特殊文字は役に立たず、1つのチャンクではできません。

すでに2つのソリューションがあります

  • 最初の解決策 :独自のスニペットを作成し、コンテキストに応じて、getChunkを使用して目的のチャンクを指定します。
  • 2番目の解決策 :コンテキストごとに、独自のチャンクを作成し、キーではなくテンプレートに[[$ name _ [[* context_key]]]]を記述します。 しかし、そうであっても、この記録は調子が悪いように見えます... このソリューションをありがとうございます




ネストされたチャンクを使用する



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







では、シンプルな
スニペット
 <?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スニペットが最初に呼び出されたとき、文字列[[+ item]]が入り、すでに解析されたプレースホルダーのみが後続のプレースホルダーです



解決策 :このような問題のあるチャンクをファイルに保存します。 つまり 静的ボックスをチェックして、ファイルを選択します



別の bezumkinソリューション :parseChunkをgetChunkに置き換えます。



パーサーの動作を観察します



次のように実験を行います。空のテンプレートで新しいドキュメントを作成します。 コンテンツとその他すべてを空のままにします。 チェックボックスがキャッシュに値することを確認します。
ファイル/core/mode/modx/modparser.class.phpから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 />";
      
      





さて、ブラウザでページを開きます。 o0! 番号1..2..3質問は、どの母親があなたであるかです...空白のページ。 解析するものは何ですか? ソースを注意深く見る
 $this->modx->invokeEvent('OnParseDocument', array('content' => &$content));
      
      





したがって、空白のページでも、同じイベントを3回トリガーします。 このイベントにまだコードが残っているサイトはどうなるのかと思うと怖いです。

実験のartdevueは、この関数がさまざまな条件下で実行される回数をチェックしました。 次のプレートがあります。

状態 繰り返し
[[スニペット]] 2
{{$チャンク}} 2
空白ページ 3
[[num?input = `1000`]] 5
[[* pagetitle:num]] 6
[[num?input = `[[* pagetitle]]`]] 7
存在しないスニペット 23
存在しないチャンク 23




強力なキャッシュ



作業サイトの1つで、キャッシュ付きのフォルダーを開き、椅子から落ちそうになりました。 キャッシュ内の1ページは50〜200 KBかかります。 いいえ、これは当然のことですが、ドキュメントが変更されるたびにキャッシュが更新されます。 1ドキュメントを更新-キャッシュされたページはすべて削除されます。 そして、100ページなら? 1000? これにより、数MBがプルされます。 ニュースが毎日追加されたらどうなりますか?



PSトピックの名前を変更して、気まぐれで反抗的でないようにしました



All Articles