pdoTools-クイックスニペットとライブラリのセット


MODX Revolutionサイトのコンテンツの迅速な撤回に関する私の開発に注目したいと思います。

ご存知のように、このシステムは完全にxPDOと呼ばれる独自のORM上に構築されています。 作業が大幅に簡素化され、さまざまなデータベース用に1つのユニバーサルコードを記述できるようになりました。

残念ながら、出力速度(おそらく、すべてのORM)を誇ることはできないため、その利点を通常のPDOと組み合わせて、チャンクでの作業を改善し、MODXの便利なライブラリを作成しようとしました。

主な機能:

最後の段落から始めます。

8個のユニバーサルスニペット


PdoToolsはもともと他のコンポーネントのライブラリとして発明されました。たとえば、 Ticketsはそれを使用します。

時間が経つにつれて、標準のMODXスニペットを置き換えることができる最小限のコストで優れたツールパッケージを作成できることが明らかになりました。

pdoResources
リソースを取得するためのスニペットは、getResourcesを置き換えることができます。 ほとんどすべての機能をサポートし、次の機能があります。
-異なるJOINを介して他のテーブルを接続する
-テーブルの列から選択するものを指定できます
-純粋なSQLを指定するまでの柔軟なサンプリング条件

同時に、スニペットは5〜10倍高速に動作します。

pdoMenu
サイトメニューを生成するためのスニペット。 Wayfinderを置き換えることができ、ほとんどすべてのパラメーターとチャンクをサポートします。

特にコールドキャッシュを初めて使用する場合は、高速に動作します。

pdoPage
getPageの代替。 より正確なページネーションを生成し、無効なリクエストをページに押し込んでリクエストパラメータを制限することを許可しません。

pdoUsers
サイトのユーザーを表示するスニペットは、グループとロールでそれらをフィルターできます。

pdoCrumbs
パンくずリストの高速置換、BreadCrumbの置換。

pdoNeighbors
隣接するページドキュメントを表示します。 つまり、次、前、および親です。 ニュースナビゲーションに使用すると非常に便利です。

pdoField
TVパラメーターを含む、リソースまたはその親のフィールドを受け取るスニペット。 getResourcesFieldとUltimateParentを置き換えます。
「デフォルト値」を表示できる。

pdoSitemap
サイトマップの生成。 GoogleSiteMapの非常に高速な交換で、差は最大12倍です。



ほとんどの初心者ユーザーにとっては、MODX Revoltuionですばやく快適に作業するにはこれで十分なので、スニペットの簡単な説明を投稿の冒頭で具体的に提供しました。

実際、標準スニペットをpdoToolsの類似物に置き換えると、平均的なサイトの実行が2〜3倍速くなります。 ドキュメントページをご覧になり、 ここでスニペットのパラメータと例の詳細をご覧ください。

私の追加の美しさは、特別な操作を必要としないことです。 リポジトリからインストールするだけで使用できます。 何かがあなたに合わない場合、それはバグがあり、期待どおりに動作しません-古いネイティブスニペットはまだあなたにあります、あなたはそれらを使うことができます。

そして、pdoToolsがすぐに動作する理由を説明します。

データベース選択


MODXの各テーブルについて、.mapファイルに説明があります。 すぐに使用できるシステムは、MySQLとMSSQLの2つのデータベースをサポートしているため、pdoToolsのすべてのクエリはxPDOを介して生成されます。

始まりは常に同じです:
$q = $modx->newQuery('modResource'); $q->select(array('id', 'pagetitle', 'content')); $q->sortby('id', 'asc'); $q->limit(10); 


そして、次のいずれかのオブジェクトを選択できます。
 $resources = $modx->getCollection('modResource', $q); foreach ($resources as $resource) { print_r($resource->toArray()); } 


または配列:
 if ($q->prepare() && $q->stmt->execute()) { $resources = $q->stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($resources as $resource) { print_r($resource); } } 


著者のコンポーネントで使用されている古典的なMODX Revolutionパスは、xPDOを介してサンプリングされ、オブジェクトをさらに処理します。 これはもちろん便利です-結局のところ、オブジェクトフィールドとチェックの異なる変換をモデルに書き込むことができます。

しかし、残念ながらこれも非常に遅いです。 したがって、私は2番目の方法-PDOによるサンプリングを使用します。 数倍高速です。

チャンクの有能な仕事


チャンクは、誰も知らない場合、これらはHTMLのみを含むMODXツリーの要素です。 これらは、PHPスクリプトの動作を形式化し、システム内のプレゼンテーションからロジックを分離するために必要です。

通常のチャンクは次のとおりです。
 <p>[[+idx]]. <a href="/[[+uri]]">[[+pagetitle]]</a></p> 


チャンクには、パーサー用の特別なコマンドがあります。例:
 <p>[[+idx]]. <a href="/[[+uri]]">[[+menutitle:isempty=`[[+pagetitle]]`]]</a></p> 


各タグ[[+ key]]は、MODXパーサーの将来のオブジェクトです。 この方法で、さまざまなパラメーター、フィルター、および一般的にプログラムを指定できます。

遅いのと同じくらいクールです。

そのため、pdoToolsでは、チャンクが前処理されます-可能なデータはすべて、受信データの通常のstr_replace()に置き換えられ、次にリンク[[〜[[+ id]]]]が置き換えられ、次にレキシコンプレースホルダー[[%key]]左(初期作業の10%)はMODXパーサーに送信されます。

最終的な結果に違いはありませんが、このような処理の速度は標準の数倍です。

使い方はとても簡単です。
 $pdo = $modx->getService('pdoTools'); return $pdo->getChunk('', array('    ')); 


オリジナルのmodX :: getChunk()とは異なり、pdoTools :: getChunk()では、既に準備されたチャンクだけでなく、 INLINEバインディングを使用してすぐにそれらを示すこともできます。
 $pdo = $modx->getService('pdoTools'); $tpl = '@INLINE <p>[[+idx]]. <a href="/[[+uri]]">[[+pagetitle]]</a></p>'; $array = array( 'idx' => 1, 'pagetitle' => ' ', 'url' => '/page.html' ); return $pdo->getChunk($tpl, $array); 


テレビを操作する


pdoToolsとそのスニペットは、すべての作業をデータベースへの1つのクエリに入れようとします。 したがって、指定されたすべてのTVパラメーターはLEFT JOINを介して接続されます。

次のように簡単に指定できるため、テレビでのフィルタリングが非常に便利になります。
 [[!pdoResources? &parents=`2` &includeTVs=`myTV` &where=`{"myTV:>":10}` ]] 


そして、id = 2で、TV値myTVが10より大きいコンテナからすべてのリソースを取得します。非常に複雑な条件と選択を指定できるため、ロギングシステムを作成しました。

ライブラリログ


ほとんどすべてのスニペットは&shoLog = `1`パラメーターを理解し、マネージャーにこのような混乱を表示します。

条件を作成し、データベース内のクエリをデバッグすると非常に便利です。

ライブラリの使用


ライブラリはmodX :: getService()を介して次のように接続されます。
 //       $pdo = $modx->getService('pdoTools'); //       $pdo = $modx->getService('pdoFetch'); 


最初の方法では、チャンクをすばやく処理できます。
 $pdo->getChunk(); $pdo->parseChunk(); 


2番目の方法では、リソースをすばやく選択できます。
 $pdo->getObject('modResource', 1); $pdo->getCollection('modTemplate', array('id:>=' => 2)); 


それらを組み合わせると、サイト全体が次のようになります。
 <?php //   $pdo = $modx->getService('pdoFetch'); //   $tpl = '@INLINE <p><a href="/[[+id]]">[[+pagetitle]]</a></p>'; //     $resources = $pdo->getCollection('modResource'); $output = ''; foreach ($resources as $resource) { //  $output .= $pdo->getChunk($tpl, $resource); } //    $output .= '<pre>'.$pdo->getTime().'</pre>'; return $output; 


2012年のサイトページの結論を0.5秒でどう思いますか?

modX :: getChunk()を使用すると、0.5秒ではなく4秒になります。 これは、条件なしで単純なチャンクを処理する場合の唯一の違いです。

必要に応じて、&checkPermissionsパラメーターで権利チェックを指定することにより、権利チェックを有効にできます。 これは遅くなりますが、標準のMODXメソッドよりも高速です。

おわりに


これは、pdoTools機能の非常に短い要約です。

このコンポーネントはほぼ1年間開発されており、最も幅広い機能を備えています。 正直なところ、彼ができることすべてを説明するのは難しいですが、私は試してみました。

ドキュメントへのリンク。
リポジトリへのリンク。
Simple Dreamリポジトリの最新バージョン。
公式リポジトリの安定バージョン。
modx-test.comで問題なくテストできます。

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


All Articles