MODx Evolutionのソースを調べたところ、ほとんど打撃を受けました。 Ilyichが言うように、リファクタリング、リファクタリング、リファクタリング。 これによると、明らかに数時間のリファクタリングを行うのに十分な時間がありませんでした。 しかし、会話はそれについてではありません。
私の意見では、MODxテンプレートシステムは最高のシステムの1つです。 MODx Revolutionの開発者は特に良い仕事をしました。 すべてが論理的で、拡張可能で、柔軟で、ただ牧歌的です。 MODxテンプレートの構文は、ほぼ別個のマークアップ言語であると言えます。 この賞賛が、他のプロジェクトでこのテクニックを使用し始めた理由になったのです。 そして、爪を顕微鏡で釘付けしないように、つまりランディングページにMODxを設定せずに、このテンプレートを使用できるようにするために、別のテンプレートクラスを作成しました。 さらに、名前を付けました-QuadBraces。
ただし、最初に警告したいのは、パーサーの通常のMODx-eramチャンク、テンプレート、スニペット、および拡張機能はデータベースではなくファイルに保存されるということです。 テンプレートデータを含むファイルへのパスは、定数QBPARSER_TPL_PATHを定義することにより決定されます。
特徴
- テキストデータの再帰処理。
- 使用される要素の種類:チャンク、定数、設定、プレースホルダー、デバッグ、スニペット、言語構成体、自動反復子。
- いわゆる決定する能力 テンプレートパック(パーサーテンプレートフォルダー内)。これにより、既製のテンプレートパッケージを開発、インストール、使用できます(Unnamed-Me-Usually-Engineなど)。
- テンプレートコンテンツを構造化する機能。 チャンク/テンプレート/スニペットエイリアスのドットは、実際にはディレクトリ区切り記号を意味します。
- エラーは例外をスローするため、コードのデバッグが容易になります。
- プレースホルダーと「設定」の配列をインストールすると、既存のデータが追加されます。
- 既製のアクセサーアルゴリズム。
- MODxとは異なり、スニペットのネストの深さは、パーサーの最大処理レベルによってのみ制限されます。
本質的に、このクラスは定期的な再帰テキストプロセッサです。 プレースホルダーと「設定」のデータは、最終開発者が決定します。 スニペットと同じように-このクラスを使用するのはすべて良心です。 つまり、自分で書く=)
クラスソースはgithubで入手できます-github.com/XanderBass/quadbraces
パーサーの使用例:
<?php require 'qbparser.php'; $parser = new QuadBracesParser(); $parser->templatePack = 'default'; // - $parser->template = 'index'; // $parser->data = array( 'foo' => 'bar', 'pagetitle' => ' ', 'content' => 'Hello world!' ); $parser->settings = array( 'my_setting' => ' ' ); echo $parser; ?>
パーサーは言語構造をサポートしていることに注意してください。 辞書は言語フォルダー(デフォルトではQBPARSER_TPL_PATH.'lang'.DIRECTORY_SEPARATOR)に含まれている必要があります。各サブフォルダーの名前は言語署名(enまたはruなど)に対応しています。 各辞書ファイルには拡張子lngがあり、記号「|」で区切られた行のセットが含まれている必要があります。 このような行の最初の要素はキー、2番目はキャプション要素、3番目はヒント要素です。
チャンク、テンプレート、およびスニペット(および拡張機能)を検索する場合、いわゆる検索が実行されます。 ローカライズされたアイテム。 この機能を使用すると、特定の言語のチャンクの個別の実装を作成できます。
ところで、変数の問題に。 実際に変数を追加することは、プレースホルダーを追加することと同じです。
<?php $parser->data = array( 'items' => array( array('id' => 1,'title' => ' 1'), array('id' => 3,'title' => ' 3'), array('id' => 2,'title' => ' 2') ) ); ?>
このコードは、データパーサー配列全体を上書きしません。 このコードは、この配列の「items」要素のみを上書きします(存在しない場合は作成します)。
サポートされている拡張機能
is、eq-等式(比較された値、それから)
isnot、neq-不等式(値の比較、それ以外の場合)
lt-より小さい(比較値、それから)
lte-より小さい、または等しい(値の比較、それ以外の場合)
gt-より大きい(比較値、それから)
gte-以上(比較された値、それ以外の場合)
偶数 -パリティの符号(値の比較、それ以外の場合)
奇数 - 奇数記号(比較した値、それ以外)
for-整数反復子(反復回数、開始、スプリッター)
foreach-インデックスイテレータ(インデックスのコンマ区切りリスト、スプリッター)
-拡張の場合、内部プレースホルダー[+イテレータ+]が利用可能です 。
現在の反復数
-foreachを拡張するための内部プレースホルダーが利用可能です:
[+ iterator.index +] -現在の反復の位置番号
[+イテレータ+] -現在のインデックス
機能の例
パーサーフォルダーのファイル/path/to/my-chunk.htmlにあるチャンクの処理されたコンテンツを出力します。 すでに述べたように、すべてを1つのヒープにダンプすることなくテンプレートのデータを構造化する機能。{{path.to.my-chunk}}
my-chunkチャンクの処理されたコンテンツを表示し、プレースホルダー[+ foo +]をその中の文字列 "bar"に置き換えます。 この機能により、かさばるイテレータスニペットを使用せずに実行できます。 着陸時に12個のプロジェクトを表示する必要がありますか? これ以上簡単なことはありません! プロジェクトの出力チャンクを作成し、ページ上で必要に応じてローカルパラメータを置き換えて、数回愚かに呼び出します-PROFIT!{{my-chunk &foo=`bar`}}
上記と同じ、cool-dataプレースホルダーのみ。[*cool-data &foo=`bar`*]
cool-dataプレースホルダーが空の場合、文字列「bar」が表示されます[*cool-data:empty=`bar`*]
定義されている場合、定数MY_CONSTANTの内容を出力します。 任意の定数で機能します。 「マジック」定数でより正確に。 時々奇妙なことが起こります。{*MY_CONSTANT*}
テンプレートフォルダーからmy / cool / snippet.phpスニペットを実行し、引数インデックスと値「foobar」を引数として持つ要素を含む配列を渡します。 スニペットの結果が空の場合、文字列「empty」が表示されます。[!my.cool.snippet:empty=`` &argument=`foobar`!]
{{my_chunk:for=`6`:splitter=`< br / >`}}
チャンクmy_chunkを6回出力し、<br />タグを使用して出力を分割します(タグ内のスペースを削除します)
言語がロードされている場合、エラー文字列言語要素のヒントが表示されます[%error-message.hint%]
一般に、このパーサーの使用について無限に空想することができます。 基本的な例は、GitHubのREADMEにあります。 だから実験。 コメントで質問をし、エラーがある場合はそれについても書いてください。 私はチェックした-すべてが動作します。
UPD 1 :
-githubで利用できるようになりました-github.com/XanderBass/quadbraces
-多数のリクエストにより(皮肉がありました)イテレータが追加されました
-コードはもう少し良くフォーマットされています
-言語構成要素を追加し、ファイル要素のローカライズされたバージョンを検索
UPD 2 :
-データ配列要素の自動反復子を追加しました。これは配列です