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);
}

これは問題なく動作しますが、現在探しているのは、データベースから不明な数のレコードを表示するためにループしたい場合であり、いくつかのアイデアを試しましたが、これまでのところ機能していないようです

4

3 に答える 3

1

Zed が既に言ったように、PHP には多くのテンプレート言語があり、最も人気のあるものはSmartyであり、学習目的以外で車輪を再発明することが本当に意味があるかどうかはわかりません. 実行したいループは、実際には要素を置き換えるよりもはるかに複雑です。多くの正規表現を使って何とかできると確信していますが、ある時点で、ビューファイルを解析し、構文ツリーを作成し、それを評価する独自のスクリプト言語を (Smarty の連中が行ったように) 書くことになるでしょう。新しい PHP ファイルにコンパイルします。これは非常に複雑なので、既存のテンプレート エンジンを使用するか、テンプレート言語自体として PHP を使用することをお勧めします ( MVCパターンに厳密に従っていれば、それについては多くの議論がありますが、動作する可能性があります)。

正規表現を使用すると、{for ...}{/for} の間のすべてを解析して、指定された変数名を持つ項目にアクセスできます。ここで、{for と } の後、変数の定義が発生し、} の後と {/for} の前になります。あなたのhtml定義。それは、相互にネストすることさえできない foreach ループのようなものです。

{for item=$varname}
    <p>{item.othervalue}</p>
{/for}
于 2009-08-18T10:53:00.613 に答える
1

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

{while(condition)}code{/while} のようなものが必要な場合は、再帰も可能であるため、正規表現を照合するほど単純ではないことに注意する必要があります。

簡単なアプローチは次のとおりです。

  • トークン (変数、whileloop) の開始を見つけ、それを見つけた位置を覚えておく
  • それが変数であり、最も外側のスコープにいる場合 (ループ内ではない)、置換を行って処理します。ポインターを調整して、後で置換を読み取らないようにして、不要なものを置換しないようにします。
  • ループだと
    • 括弧の間の条件を抽出し、どこかに保存します
    • さらに、現在の場所を保存します
    • トークンをスタックにプッシュして、現在の再帰レベルを記憶します。
    • {/while} トークンに遭遇したら、スタックからトークンを削除します。
    • ここで再帰的に処理を進め、ネストされたすべてのループ トークンをスタックにプッシュし、終了時にそれらを削除します。一番外側のレベルに戻ったら停止します。
    • ループの状態を評価します。true である限り、開始トークンと終了トークンの間のソース テキストから新しいコピーを作成し、再帰を使用してそれらを処理します。
    • 中間結果を連結し、{while} から {/while} までのすべてをこの連結に置き換えます。ループの後に指すようにポインターを調整して続行します:)

これが役立つことを願っています。少し面倒に聞こえるかもしれませんが、概念を理解していれば実行できるはずです (ただし、非常に効率的ではなく、smarty のようなテンプレート エンジンのコンパイルは、テンプレート ファイルを 1 回だけ解析するため、常に事前に行われます)。そしてそれを PHP コードにコンパイルします)。

@Daff: 正規表現でトークンを見つけることができますが、1 つの正規表現を使用してループ構造全体に一致させることは、再帰のために機能しません (正規表現に再帰拡張がない限り)。

于 2009-08-18T12:04:12.733 に答える
0

これを学びたいと思っているなら (私のように)、http://net.tutsplus.com/tutorials/php/roll-your-own-templating-system-in-php-new-premium-tutorial/にアクセスしてください。 - これはこれに関するチュートリアルですが、それを読むにはプラスメンバーである必要があります :)

于 2011-02-26T15:48:34.560 に答える