0

何年も前にチュートリアルで見たように、実際には「自分のもの」ではない独自のPHPテンプレートエンジンを使用してきました。ただし、ほとんどのコードをリファクタリングして、よりシンプルで使いやすくしました。それなしでPHPプロジェクトを作成することはめったにありません。

これは非常に基本的なものであり、クラスにはロード、割り当て、レンダリングの3つのメソッドしかありません。loadテンプレートファイル(通常はHTML)をロードし、文字列変数として保存します。はassign、HTML内の参照を。の形式で変数に割り当てることができます{reference}。レンダリングはテンプレートファイルを解析し、参照を変数に置き換えます。基本的にはそれだけです。非常に基本的で、非常にシンプルで、時間の節約になります。

PHPとHTMLなどを組み合わせるのが嫌いなので、このテンプレートエンジンが好きです。そのため、私は(WordPressテンプレートのような)テンプレートエンジンとしてのPHP自体はあまり好きではありませんが、そのようなことには非常に強力です。ファイルを.phpファイルとして保存し、それらを多数の混合PHPコードに含めたり、要求したりするというアイデアは好きではありません。シンプルに保つのが好きです。

ただし、このテンプレートエンジンは基本的なものであり、条件とループを許可していません。これは、時々必要となる2つの非常に重要なことです。これまでのところ、テンプレートファイルを分離してから、コントローラーですべての条件/ループを実行することで、この問題を回避してきました。たとえば<ul>、アイテムがデータベースから取得されたリストを含むメインテンプレートファイルがありますが、アイテムの1行のコードを含む別のテンプレートファイルがあり<li>ます。コントローラでループを実行し、<li>'s必要な数だけレンダリングします。

これは紹介だったので、私がどこから来たのか理解できます。さて、本当の質問に...

私はこの方法の代替案を考えて実験しており、可能な限り少ないコードでHTMLテンプレートファイルでPHPの使用を開始しています。たとえば、次のようになります。

<ul>
  <?php foreach($array as $val): ?>
  <li><?php echo $val; ?></li>
  <?php endforeach; ?>
</ul>

そして、コントローラーでは次のようなものがあります。

// assuming the data comes from a 
$array = array('Item 1', 'Item 2', 'Item 3'); database...

ob_start();
eval(' ?>'.$TPL->render('main').'<php ');
echo ob_get_clean();
  • 私が言いたい最初のポイントは、これが私にとって問題を提示するということです。これは、このテンプレートエンジンの目的をやや破ります。echo $valそこに、私はどこに置き換えられるべき参照があるべきかを呼びかけています。$valしかし、変数が使用されるのを待っているときに、テンプレートレンダリングで参照を置き換えることは、完全にばかげていることではないでしょうか。しかし、テンプレートファイルで多くのPHPコードを使用するというアイデアも好きではありません。全体をあまり妥協せずに、できるだけ多くのコードを使用しないようにしたいと思います。ただし、の代わりに参照を設定して、ループごとechoに置き換える方法がわかりません。$valこれについてどう思いますか?
  • 第二に、私はあなたの意見とあなたがこの解決策が持っているかもしれないと思う[もっと]問題をお願いします。または、コードに何か問題がある場合や、どのように改善できるかなど...テンプレートのレンダリングを簡素化するために、すべての出力バッファリングと評価を行うために追加のメソッドを使用できることはわかっていますが、他のものを探していますおそらく、知識を見落としているか、完全に忘れているか、単に知識を見逃している可能性があります。

多分私はこれについて考えすぎているかもしれません、多分私はただ全部を忘れて、過去数年間やってきたようにこれを続けなければなりません。それは私にとって非常にうまく機能し、私のすべてのプロジェクトを簡素化しました。結局、私は基本的に、追加のテンプレートファイルを必要とせずに、テンプレートファイルの条件とループを単純化する方法を探しています。一部のファイルには、数行の単純なコードしかありません。

4

1 に答える 1

1

他の言語がこれに対処する方法は、aspリピーターコントロールのようなサーバー側のマークアップを提供することであると信じています。この質問もここで見つかりました。これは、ソリューションに固執することを示唆し、独自のカスタムテンプレートタグをロールすることを提案する人に-1を与えます。同じことを達成する...多分それはそれほど単純にはならず、それを構築することは過剰設計です。

于 2010-09-14T04:20:16.347 に答える