13

既存の良い例はありますか、またはPHP5で「テンプレートの継承」をサポートする基本的なテンプレートシステム(MVCを考える)を作成するための1つのアプローチはどのようにすべきですか?

テンプレートの継承として定義する例については、Django(Web開発用のPythonフレームワーク)テンプレートのドキュメントを参照してください:http://docs.djangoproject.com/en/dev/topics/templates/#id1

PHP自体が「テンプレート言語」であるという考えは特に気に入っていますが、必ずしも必須ではありません。

「テンプレートの継承」を実装する既存のソリューションをリストする場合は、「人気投票」の利益のために、個別のシステムとして回答を作成してみてください。

4

10 に答える 10

17

古いスレッドを掘り起こして申し訳ありませんが、ネイティブ PHP でテンプレートを継承するライブラリをリリースしました。Django に非常にインスパイアされています。それをチェックして、あなたの考えを教えてください:

「PHP テンプレートの継承」

http://arshaw.com/phpti/

于 2010-03-29T01:04:37.617 に答える
8

Soulmerge が出した答えは、テンプレートの継承とは何の関係もありません。

個人的には、テンプレートの継承は素晴らしいと思いますが、それについて不満を言う人を見るのはこれが初めてです。

phpti は先ほど指摘したオプションの 1 つですが、私には少し見栄えが悪いです。

テンプレートの継承をサポートし、多くの言語 (php を含む) で実装されている mustache (mustache.github.com) を検討することをお勧めします。PHP で口ひげテンプレートを使用するには、おそらく口ひげファイルを読み込んで処理する何らかのコントローラーを作成する必要があります。

于 2012-05-10T09:41:19.397 に答える
3

symfonyはテンプレートの継承をサポートしています。これはdjangoに非常によく似ているため、構文はdjangoやその他の美しいjinjapythonエンジンと互換性があるように見えます。

PHPをテンプレート言語として使用するようなエレガンス:

<h1><?php echo $page->title; ?></h1>
<?php foreach($page->comments as $comment): ?>
    <?php echo $comment->body; ?>
<?php endforeach; ?>
<?php echo $page->comments->count(); ?>

またはさらにエレガントな、jinja:

<h1>{{ page.title }}</h1>
{% for comment in page.comments %}
   {{ comment.body }}
{% endfor %}
{{ page.comments.count %}
于 2009-07-10T02:10:06.727 に答える
1

PHP言語自体は、これらのタスク専用に設計されていましたが、[残念ながら]時間の経過とともにますます可能になり、その単純な構文から始めた人々は、奇妙に進化した言語でますます複雑なタスクを実装し始めました。

テンプレートの継承とは、PHPでの動的なファイルインクルードとして、次のように単純に表現するのが最適だと思います。

<? require $content ?>
于 2009-06-03T19:38:07.610 に答える
1

クラス継承がどのように機能するかを理解していると仮定すると、答えは「はい」です。PHPはそれをサポートしています。djangoのことはやり過ぎかもしれませんが、とにかくそれを行う方法について、私はあなたに本当に簡単に記入しようとします。

注:ここではコントローラーの使用については説明しません。明らかに、ページがブログの場合、通常のページではなくblogPageオブジェクトを作成します。また、私はあなたのためにこれを最初から書いたので、それが機能することを保証するものではありません..しかし、うまくいけば、それはあなたにいくつかのアイデアを与えるでしょう。

<?php
class Page
{

    protected $content_main; // Your main page content.
    protected $content_leftbar; // Your left sidebar content.
    protected $content_title; // Your content title.
    protected $template; // Template data.

    Function getTemplate() {
        // Logic for determining the template to be used in here.
        // Let's say it returns the location of a cached version of the template.
            return $template_file_path;
    }

    Function populateContentBlocks() {
        // This populates the $content_BLOCK variables with data using some default
        // logic you have for determining where to grab that data from.
    }

    Function loadPage() {

        // Populates variables.
        $this->populateContentBlocks();

            // Fetches template
        include( $this->getTemplate() );
    }


} // END class


Class blogPage extends Page {
    Function getTemplate() {
        // Logic for determining the template to be used in here.
        // Let's say it returns the location of a cached version of the template.
        // OVERRIDE THE DEFAULT TEMPLATE LOGIC OF THE PAGE WITH WHAT IS RELEVENT TO
                // BLOGPAGE.
    }
}
?>

テンプレートファイルの例:

<html>
  <head>
    <title><?php echo $this->content_title; ?></title>
  </head> 

  <body>
      <div class="sidebar"><?php echo $this->content_sidebar; ?></div>
      <div class="mainContent"><?php echo $this->content_main; ?></div>
  </body>
</html>
于 2009-06-03T21:32:58.143 に答える
0

PHP テンプレートの継承は、良い代替手段のようです。以下、サイトからの説明です。

テンプレートの継承は、サイトの再利用可能な HTML レイアウトを作成するための非常に便利な手法です。これは、ページの共通要素 (ヘッダー ファイルやフッター ファイルなど) を「含める」などの代替手法よりもはるかに柔軟です。

この概念はしばらく前から存在しており、最も顕著なのは Django テンプレート エンジンです。他のライブラリとは異なり、PHP テンプレートの継承では、すべてをそのまま PHP で記述できます。別のテンプレート言語を学ぶ必要はありません。

詳細については、http: //phpti.com/を参照してください。

于 2012-01-06T12:43:19.160 に答える
0

優れたコンポーネント「Redstart Templating」があり、php テンプレートの継承を非常に強力な方法でサポートし、すべてのテンプレートは純粋な html と php で記述されており、さらに拡張可能です。新しいプラグインを作成して、さらにマッシュアップできます。

プロジェクトの詳細については、http://phpbeat.com/doc/templatingを参照してください。

于 2013-06-30T23:31:01.490 に答える
0

私が取り組んでいるテンプレートエンジン

(php のような構文と include/template ディレクティブをサポートし、テンプレートの継承にも取り組んでいます)

PHP、クライアント側 js、nodejs の両方を同じフォーマットでサポート

https://github.com/foo123/Contemplate

于 2013-08-11T07:24:57.737 に答える