3

OOP フレームワークの一部として php で独自のテンプレート レイヤーを構築しようとしていますが、これを適切に行う方法の例を探しています。テンプレートエンジンに何をすべきかを伝えるコメントを見つけるために各htmlファイルを解析するのは避けたいと思いますが、より高速でクリーンな最新の手法を使用します。私はグーグルを使って周りを見回しましたが、何も私の目に留まらなかったので、いくつかの例が必要です。プレゼンテーションとロジックを分離しようとしていますが、HTML コード全体に大量のロジックが必要です。

、ありがとう

PS smarty などの既存のテンプレート エンジンを使用するつもりはありません。独自のテンプレートを作成したいと考えています。

4

5 に答える 5

14

Smarty を提案する人に尋ねるのと同じ質問をあなたにします。

テンプレート言語であるPHPに、なぜテンプレート言語を追加したいのですか?

PHP はテンプレート言語です。人々はそれを忘れているか、そうではない純粋なオブジェクト指向言語のように扱おうとしていると思います。PHP の長所を活用します。そうではないものにしようとしないでください。

そうは言っても、テンプレートシステムがどれほど単純か複雑か、つまりサポートする予定の機能がわからないため、質問に答えるのは難しいです。

テンプレート言語が比較的単純な場合は、正規表現が適している可能性があります。ただし、いくつかの些細なケースでは機能しません。制御構造のネストは、おそらく最も一般的です。その場合、何らかの形式の初歩的なパーサーを作成する必要があります。

すべてのテンプレート構造が次のようなブロックになっているとしましょう:

{:...:}

それ以外の場合は HTML ページで発生する可能性は比較的低いためです (ただし、完全を期すために、ユーザーが実際にこれらの文字の組み合わせを使用したい場合に対応する必要があります。

ファイルをスキャンしてそのような式を探し、それに応じて処理する必要があります。正規表現を使用してそれらすべてを見つけることができますが、条件付きインクルードのように必ずしも一致するとは限りません。

{:if ...:}
Some conditional content
{:endif:}

なんで?このため:

{:if *some condition*:}
{:if *some other condition*:}
Some other conditional content
{:endif:}
Some conditional content
{:endif:}

それを正規表現と確実に一致させることはできないため、ファイルを何らかの形式の語彙素のツリーに解析してから処理する必要があります。

于 2009-04-26T01:17:27.817 に答える
5

Model-View-Controllerパターンについて考えましたか?関数と変数(コントローラー内)を使用してすべてのロジックを抽象化し、それらをビューに公開することができます。テンプレート作成の最初のステップになる可能性があります。

PS:PHPTAL(テンプレート属性言語)と呼ばれるテンプレートエンジンをテストしました。デザインを壊すことなく、カスタムhtml属性内にロジックが埋め込まれたhtmlテンプレートを作成できるので、私はそれが好きでした。

これらのアイデアがお役に立てば幸いです。

于 2009-04-26T00:25:11.967 に答える
1

php はテンプレート言語であるため、最速の方法は php 自体を使用することです。もちろん、セキュリティ上の理由や、デザイナーが基本的な php を学ばなければならないという理由で、それが選択肢にならない場合もあります (これは非常に苦痛です)。場合によっては、他のより専門的な (そしてそれほど強力ではない) テンプレート システムがクリーンな状態を維持できる場合でも、非常に見苦しくなります。

あなたが本当にあなた自身のものを構築しなければならないなら、私の頭から3つのオプションがあります...

  1. 初心者として、カスタム解析 (strpos、substr など) を使用していくつかのテンプレートを作成しました。非常に遅く、洗練されておらず、エラーが発生しやすいものでした。私はそれをお勧めしません。

  2. 正規表現の騒乱。正規表現に慣れていない場合は、忘れてください。しかし、それはおそらくより速い方法の1つです。

  3. おそらく、 phpトークナイザー関数と一緒に何かをパスすることができます...

  4. DOM拡張!テンプレートを xhtml に準拠させ、xml ファイルとしてロードします。おっと、すべての解析はあなたのために行われます! これで、次のようなカスタム タグが付いた素敵なツリーができました。


      <loop item="$myVariable" times="$x">
        <print name="$myVariable->name" entities="yes" nl2br="yes" purify="removeemptytags, xss"/>
        <hr/>
      </loop>

すでに少しスマートに見えます。何らかの解釈を行う (ループノードのサブノードを $x 回エコーする) か、おそらくそれを php に変換してキャッシュする必要があります (smarty はパフォーマンスのためにこれを行います)。

または、コメントを好む場合は、次のようなものです (ただし、ここでは、カスタム タグを使用するよりも多くの解析を行う必要があります)。


    <!-- begin loop:myVariable -->
      <-- print:myVariable->name() -->
      <hr/>
    <!-- end loop -->

DOMメソッドが非常に高速であるとは想像できませんが、本当に速度が必要な場合は、ネイティブphpコードへの変換および/またはレンダリングされたhtmlのキャッシュがより良いでしょう(速度が本当に重要な場合は、あなたのあなたがカーマックかスキートの場合を除いて)。

幸運を。

于 2009-04-27T13:06:36.667 に答える
0

パーサーを実装する必要があります。ただし、毎回解析する代わりに、Smarty や他の人が行っていることを実行して、後で使用するために解析済みの出力を保存します。パーサーの出力が PHP コードそのものであるとさらに良いでしょう。

于 2009-04-26T02:17:52.163 に答える
0

...プレゼンテーションとロジックを別々に保とうとしていますが、私がやっていることには、HTMLコード全体に大量のロジックが必要です....

ねえ、これがある...

あなたがやろうとしていることの例を教えてください。あなたの状況がなぜ特別なのか、あなたのタイプの問題に対する特別な解決策があるのか​​ がわかるかもしれません。テンプレートエンジンを書きたいのですが、それを行うための最善かつ最速の方法は何かというだけでは、あまり役に立ちません。真剣に、私は彼らの多くを取り上げ、彼らが何をしているかを見て、なぜ彼らがしたのかを理解し、学び、より良いものが必要な場合は別のことをします.

于 2009-04-25T23:58:49.720 に答える