「PHPTALは、PHP用の優れたZopeページテンプレート(ZPT)システムの実装です。 PHPTALは、TAL、METAL、I18N名前空間をサポートします。そして、PHPTALESは、テンプレート属性言語式構文であるTALESと同等です。 XML属性値の処理方法を定義します»
これは、 http://phptal.org/のLGPLライセンスの下で提供されています。
PHPTALでテンプレートを作成してから約1年が経ちますが、これは「魅力的」だと考えています:)。 コードにはパッチがいくつかあるので、内部からトピックを知っています。
さらに、私は作家ではないこと、そして「トピックを開く」という行商人の要求に強く反対した理由をあなたが明確に理解するレビュー記事を作成し、この傑作を少なくとも少し普及させたいと思っています。
XML構文
TALテンプレートとPHPTALテンプレートもそれぞれXMLドキュメントであり、「山括弧のある場所」ではなく、残酷で本物です。
ここにはエンティティとCDATAセクションの両方があり、それは信じられないでしょうが、XML宣言です。
それはどうですか?
この規律-レイアウトが「突然」移動するため、閉じられていないタグはありません。テンプレートエンジンはそのような混乱を見逃しません。
XML形式を理解しないコードエディターはおそらくないでしょう。
あなたのコーダーは男子生徒ではありません。
なぜこれが悪いのですか?
あなたのコーダーは男子生徒ではありませんが、それはプラスだったことを覚えていますが、今では10ドルでフロントページにサインを作りません
IEのハッキングの実装は腹を立てることがあります(最後の例の1つ)
Inline-JSをCDATAセクションとしてフォーマットするか、個別のjsファイルで「成人向け」にフォーマットすることをお勧めします。
誰かがXMLに関する本を読む必要がありますが、これが悪いかどうかはわかりません。
属性
TALのすべての能力は属性に隠されており、仕様では正確に1つの要素が記述されており、仕様で述べられているように「構文糖」であり、それなしで完全に実行できます。 したがって、TALとは属性を意味します。
これは良いことです-すべての人にとって、XHTMLからレイアウトを取得するとき、それはすでにTALテンプレートであり、それから反復的に「プル」するだけです。「テンプレートをプル」することでプロセスが非常に正確に特徴付けられます。
PHPTALで言及されている仕様には、最大18個のサービス属性が記述されていますが、そのうちの良い属性を使用することは決してありません。
さらに、私は非常に重要で使用されているものを非常に簡単に説明します-コードで説明します:
tal:定義、tal:コンテンツ
<div tal:define = "global title obj / getTitle; content obj / getContent"> <div class = "post_title" tal:content = "title"> Lorem ipsum </ div> <div class = "post_content" tal:content = "content"> Lorem ipsum </ div> </ div>
通常の定数のスコープは、それらが定義されているタグによって制限されます。この機能はxsltに由来し、名前による交差を回避します。
グローバル定数はテンプレート処理ストリーム全体に作用し、テンプレートを継承することができるため、テンプレートではなくストリームを記述します。テンプレートを処理すると、テンプレートのチェーンが実際に処理されます。
グローバル定数が強く「配信」される場合の例-トピックの最後。
tal:条件、tal:繰り返し、tal:属性、i18n:翻訳
<div tal:repeat = "post posts" tal:attributes = "class php:repeat.post.odd? 'odd':NULL"> <div class = "post_title" tal:content = "post / getTitle"> Lorem ipsum </ div> <div class = "post_content" tal:content = "post / getContent"> Lorem ipsum </ div> <a class="post_cut" tal:condition="post/hasMore" i18n:translate="">詳細</a> </ div>
以下に、「もっと」とシマウマへのオプショナルリンクを含むトピックのリストを示します。
シマウマのテーマは公式のマナphptal.org/manual/ru/split/tal-attributes.htmlで明らかにされています
テンプレートエンジンが完全にバインドされると、このテンプレートでは、「続きを読む」というテキストが翻訳者によって翻訳されます(デフォルトではgettext)
メタル:定義マクロ、メタル:使用マクロ、メタル:定義スロット、メタル:フィルスロット
これらの4つの属性はテンプレートの継承を実装し、すべてに共通する基本的なレイアウトを継承するhome.htmlテンプレートを使用します。
home.html
<?xml version = "1.0"?> <tal:ブロックメタル:fill-slot = "custom-js"> <script rel = "stylesheet" src = "/ mootools-1.2-fx.js" type = "text / javascript" /> </ tal:block> <tal:ブロックメタル:fill-slot = "custom-css"> <style type = "text / css" media = "all"> @import url(<tal:block tal:content = "/ main.css" />); </ style> </ tal:block> <tal:ブロックメタル:use-macro = "layout / page"> <body metal:fill-slot = "body" tal:define = "global title post / getTitle"> <div tal:content = "post / getContent">コンテンツテキストの投稿</ div> </ body> </ tal:block>
layout.html
<?xml version = "1.0" encoding = "utf-8"?> <!DOCTYPE html PUBLIC "-// W3C // DTD XHTML 1.0 Strict // EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html metal:define-macro = "page" xmlns = "http://www.w3.org/1999/xhtml"> <head> <title tal:content = "title | default"> PHPTALのグローバルタイトルの例</ title> <tal:ブロックメタル:define-slot = "meta"> <meta http-equiv = "Content-Type" content = "text / html; charset = UTF-8" /> <meta name = "generator" content = "velocity framework" tal:attributes = "コンテンツジェネレーター|デフォルト" /> <meta name = "description" tal:condition = "exists:description" content = "$ {description}" /> <メタ名= "キーワード" tal:条件= "存在する:キーワード" content = "$ {keywords}" /> </ tal:block> <script rel = "stylesheet" src = "/ mootools-1.2-core.js" type = "text / javascript" /> <tal:ブロックメタル:define-slot = "custom-js" /> <style type = "text / css" media = "all"> @import url(<tal:block tal:content = "/ main.css" />); </ style> <tal:ブロックメタル:define-slot = "custom-css" /> </ head> <body metal:define-slot = "body"> Lorem ipsum </ body> </ html>
もっと
説明する10個の属性は開始するのに十分であり、残りの8個はmana
尾
上記からわかるように、式は特別な形式で記述されています。一般的な式の形式は次のとおりです。
prefix:
プレフィックスが定義されていない場合、
prefix:
は「パス」に等しいと見なされます
PHPTALには5種類の式(パス、php、文字列、not、existes)が定義されており、元のTALではphpがpythonに置き換えられています。
各タイプのテール、つまり式の名前はフォーマットを定義し、すべてがマナで十分に説明されています。ベースパスのみに焦点を当てます。
パスパスは、XPath構文に非常によく似ており、次の式のように、非常に便利です。
obj/getObject2/path
、
$obj->getObject2()->path;
obj/getObject2/path
同等
$obj->getObject2()->path;
。
パスパスアナライザーは、マナから優先順位の順に適切なメソッド、メンバー、および配列キーを自動的に呼び出そうとします。
PHPTALは、開発者が必要な末尾を自分で追加し、それによって機能を拡張することを予測しています。
レセプションと例
グローバル定数
グローバル定数は非常に便利で、最も典型的な例はページタイトルです。 これで、どこでも定義できます。
layout.html
<?xml version = "1.0" encoding = "utf-8"?> <!DOCTYPE html PUBLIC "-// W3C // DTD XHTML 1.0 Strict // EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html metal:define-macro = "page" xmlns = "http://www.w3.org/1999/xhtml"> <head> <title tal:content = "title | default"> PHPTALのグローバルタイトルの例</ title> <tal:ブロックメタル:define-slot = "meta"> <meta http-equiv = "Content-Type" content = "text / html; charset = UTF-8" /> <meta name = "generator" content = "velocity framework" tal:attributes = "コンテンツジェネレーター|デフォルト" /> <meta name = "description" tal:condition = "exists:description" content = "$ {description}" /> <メタ名= "キーワード" tal:条件= "存在する:キーワード" content = "$ {keywords}" /> </ tal:block> </ head> <body metal:define-slot = "body"> </ html>
home.html
<?xml version = "1.0"?> <tal:ブロックメタル:use-macro = "layout / page"> <body metal:fill-slot = "body" tal:define = "global title post / getTitle"> ページ本文 </ body> </ tal:block>
示された例では、出力に使用されるのはhome.htmlテンプレートであり、長文のlayout.htmlは均一なフレーミングに使用されますが、それでも、特にデータベースからのブログ投稿の名前などによって動的にタイトルを表示できます
プラグ可能なリソースの継承された出力
この例は前の例に多少似ていますが、実装方法が異なります。継承テンプレートにリソースを追加する必要があるとしましょう(ローライトのヘッドセクションにあるcs js)。
layout.html
<?xml version = "1.0" encoding = "utf-8"?> <!DOCTYPE html PUBLIC "-// W3C // DTD XHTML 1.0 Strict // EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html metal:define-macro = "page" xmlns = "http://www.w3.org/1999/xhtml"> <head> <script rel = "stylesheet" src = "/ mootools-1.2-core.js" type = "text / javascript" /> <tal:ブロックメタル:define-slot = "custom-js" /> <style type = "text / css" media = "all"> @import url(<tal:block tal:content = "/ main.css" />); </ style> <tal:ブロックメタル:define-slot = "custom-css" /> </ head> <body metal:define-slot = "body"> </ html>
home.html
<?xml version = "1.0"?> <tal:ブロックメタル:use-macro = "layout / page"> <tal:ブロックメタル:fill-slot = "custom-js"> <script rel = "stylesheet" src = "/ mootools-1.2-fx.js" type = "text / javascript" /> </ tal:block> <tal:ブロックメタル:fill-slot = "custom-css"> <style type = "text / css" media = "all"> @import url(<tal:block tal:content = "/ main.css" />); </ style> </ tal:block> <body metal:fill-slot = "body"> ページ本文 </ body> </ tal:block>
インラインjs
<script type = "text / javascript"> // <![CDATA [ var $ var = $ {json:var}; //これはCDATAなので、山括弧を使用できます if($ var <1){ // bla .... bla } //]]> </ script>
サービスキャラクターを恐れずにJSを記述する方法の例を次に示します。
json:これは、JSコードの変数をマップする自己記述のテールです:)
ドキュメント
オンライン版を使用することは必ずしも便利ではありません。 テンプレートエンジンのソースコードに加えて、翻訳された50%のdocbookブックが提供されます。残りは便利な形式に変換するだけです。 http://docbook.sourceforge.net/で利用可能なツールを使用すると、chmを取得することもできます。スキルと空き時間、pdfもあります。
性能
PHPTALは、スマートで他の多くのものと同様に、PHPランタイムコードを生成し、既に動作します。コードは非常に高品質であり、これにより過度ではありません。速度は非常に非常に優れています-
http://fabien.potencier.org/article/34/templating-engines-in-php