2009-08-18 6 views
0

私は自分の小規模なフレームワークを作成し始めました。これまでのところ、私は次のコードに置き換え単純な変数を行うことができた:私は、データベースからレコードの未知の数を表示するためにループしたい場合テンプレートでループを使用する

public function view($page, $vars) 
{ 
    if(!file_exists('system/views/' . $page . '.php')) 
    { 
     trigger_error("No Template found", E_USER_ERROR); 
    } 

    $tempArray = file_get_contents('system/views/' . $page . '.php'); 

    foreach($vars as $key => $value) 
    { 
     $tempArray = str_replace('{' . $key . '}', $value, $tempArray); 
    } 

    print $tempArray; 
    unset($tempArray); 
} 

正常に動作しますが、私が今探していますがあると私はアイデアのカップラーを試しましたが、これまでに働いているようには思えません。

+0

の多くがありますオープンソースのPHPテンプレート言語、なぜあなたはそれらの1つを見ていないのですか? – Zed

答えて

1

まず、変数の書き換えを再考する必要があります。メソッドが期待どおりに終了しない場合は、いくつかのケースがあります。さらに、ループ内の変数に関係なく、すべてが置換されます。

{while(condition)}コード{/ while}のようなものが必要な場合は、再帰も可能であることに注意する必要があるため、正規表現と同じくらい簡単ではありません。

単純なアプローチは、次のようになります。

  • トークン(変数、while文)の開始を見つけ、それが可変であり、あなたがしている場合は、あなたがそれ
  • 見つける位置を覚えていますほとんどの外側スコープ(ループではありません)を置き換えて処理します。あなたがしたくないものを置き換えるのを避けるために、後で交換品を読まないようにポインタを調整してください。
  • それはループ
    • 現在の再帰レベルを覚えてスタックに現在位置
    • プッシュトークンを格納し、括弧の間に条件を抽出し、それがadditionaly somewher
    • を格納する場合。
    • {/ while}トークンが発生すると、スタックからトークンを削除します。
    • 今度は、スタック上のネストされたすべてのループトークンをプッシュし、それらが終了するときにそれらを削除します。もう一度最外層にいるときに停止します。
    • ループの状態を評価します。それが真である限り、開始トークンと終了トークンの間のソーステキストから新しいコピーを作成し、再帰を使用してそれらを処理します。
    • 中間結果を連結し、{while}から{/ while}までのすべてをこの連結で置き換えます。あなたはループの後に向いているようにポインタを調整し続ける:)

このことができますことを願っています。私はそれが少し苦しいと思うが、コンセプトを理解すれば、それを行うことができるはずです(ただし、それは超効率的ではなく、smartyのようなコンパイルテンプレートエンジンはテンプレートファイルを一度解析するので、 PHPコードにコンパイルしてください)。

@Daff:正規表現でトークンを見つけることができますが、1つの正規表現を使ってループ全体の構造にマッチすることはできません(正規表現に再帰的な拡張がない限り)。

+0

私は知っているが、私はあなたにこれがたくさん助けてくれたことを伝えたいと思ったと思った! –

1

Zedは既にPHPのテンプレート言語がたくさんあると言います。最も普及しているのはSmartyで、本当に意味があるのでしょうか?学習目的を除いて車輪を再構築する。あなたがやりたいループは実際に要素を置き換えるより複雑です。私はあなたが何とか正規表現を使って何とかそれをやることができると確信していますが、ある時点で、あなたのビューファイルを解析し、構文木を作成し、それを評価することであなた自身のスクリプト言語(Smartyの人のように)それを新しいPHPファイルにコンパイルします。これは非常に複雑なので、既存のテンプレートエンジンを使用するか、PHPをテンプレート言語として使用することをお勧めします(それについての議論がたくさんあるにもかかわらず、MVCのパターンを厳密にフォローしている場合)。

正規表現では、{for ...} {/ for}と{{for}}の間のすべての変数を特定の変数名でアクセスすることができます。 {/ for}あなたのHTML定義。それはあなたがお互いに入れ子にすることもできないforeachループのようなものでしょう。

{for item=$varname} 
    <p>{item.othervalue}</p> 
{/for} 
+0

私は主にそれを学んでいます、確かにそれのようなextreameに行くことを伴わない、それをやるいくつかの方法が必要ですか? –

+0

私はそれがどのように見えるか少しの例を追加しました。しかし、あなたが本当にそれを学びたいなら、ある極端に行きたいかもしれません...あなたのテンプレート言語としてPHPを使うのが最も簡単で、あなた自身のテンプレートエンジンを作成するのが一番簡単です。 – Daff

+0

例のおかげで、これは私が下を見ているルートのようです –

関連する問題