8

Drupal 7はどのようにページをレンダリングしますか?MVCのビューシステムに相当するものは何ですか。

リクエストの最終的なHTMLページのレンダリングに関しては、私が使用したほとんどのPHPフレームワーク(MVCベース)は、トップレベルのレイアウト/ページのPHPファイルが基本的なドキュメント構造を設定してからレンダリングするというアプローチを採用しています。インクルードまたはビューレンダリングメソッドを介したさまざまなサブビュー。

//Simplified version
Page.phtml
    Head.phtml
    Body.phtml
        Banner.phtml
        Topnav.phtml
        Left.phtml
        Content.phtml
        Footer.phtml

Drupalのこれに対する見方について少し混乱しています。私はProDrupalDevelopmentを読んでいますが、同様の領域で.から始まりますpage.tpl.php。ただし、テーマエンジン(これは正しい用語ですか?)がPHPのさまざまな部分をこのページに取り込む方法については詳しく説明します(批判ではなく、この本は私が行っている道とは異なるアプローチを取っています)。

また、Drupal 7のテーマにはファイルがないように見えるpage.tpl.phpため、ページスケルトンがどこから来ているのか(私には)明確ではありません。また、私が読んだところ、「ブロック」が関係しているように見えますが、「ブロック」がページ全体を構成しているのか、それともブロックがテーマによって選択的に使用されているのかはわかりません。

では、高レベルの概念から作業する(または、必要に応じて詳細を取得する)場合、Drupal 7はどのようにページをレンダリングしますか?

すべてがどのように結びついているかを理解せずに、Drupalから始めることができ、おそらくそうすべきであると私は理解しています。私は特に、さまざまなDrupalシステムがどのように組み合わされるかを学ぼうとしています。この免責事項を読むのにうんざりしている人々に謝罪します!

4

3 に答える 3

10

ここには2つの質問があると思います。まず、単一のテーマ/テンプレートがどのようにレンダリング/使用/表示されるか、そして次に、サイト全体がどのように統合されるかです。2番目の質問はすでに上記で回答されていると思うので、最初の質問についてもう少し説明しようと思います。

まず、モジュール(system.moduleが存在する理由です。hook_menu()の実装のようにモジュールだけが実行できるこれらすべてのことについて)は、hook_theme()で宣言することにより、特定のテーマ関数/テンプレートが存在することを定義する必要があります。

そういえば、使えるものは2つあります。テーマ関数。theme_のプレフィックスが付いた関数です。多くの場合、 theme_table()のようなより複雑なロジック/PHPを持つページの小さな要素に使用されます。そして、page.tpl.phpのようなtpl.phpを含むファイルであるテンプレート。

テーマ関数/テンプレートを使用するには、次のようにtheme()を呼び出すことができます。

$output = theme('table', array('rows' => $rows, 'header' => $header));

または、新しい、いわゆるレンダリング可能な配列のものを使用できます。これは基本的に、使用するテーマのデータと情報の配列です。

$output = array(
  '#theme' => 'table',
  '#rows' => $rows,
  '#header' => $header,
);

2つ目は、テーマができるだけ遅くなり、他のモジュールがフックで変更できることを意味するため、2番目が推奨されます。結果はまったく同じになり、drupal_render()は最終レンダリング中にtheme()自体を呼び出します。

theme()が呼び出されると、使用する関数/ファイルが検索され、使用されているテーマがオーバーライドされているかどうか、いわゆるテンプレートの提案があるかどうかが確認され、それらが使用されます。

テーマのテーマ関数をオーバーライドするには、それをtemplate.phpファイルにコピーし、「theme_」を「yourthemename_」に置き換えます。tpl.phpファイルの場合は、ディレクトリにコピーします。

さて、最終的なレンダリングプロセスが行っているのは、基本的に、レンダリング可能な配列である大きな$ page配列を構築することです(そのドキュメントの一部はhook_page_alter()にあり、drupal_render()呼び出します。

ページ/テンプレート階層のグローバル構造(ハードコーディングされていませんが、$ pageにあるものを介して与えられます)は次のようになります。

html.php.tpl
  head.php.tpl
  page.php.tpl
    multiple regions
      multiple blocks

Drupal 7では、通常はノードである実際のコンテンツを含め、ほとんどすべてがブロックです。テーマは、テーマが持つリージョンを定義し、UIでテーマにブロックを割り当てることができます。

于 2011-02-22T07:36:16.090 に答える
4

テンプレートがどのように組み合わされているかを理解しようとすると、私が見つけた最高のツールはテーマ開発者モジュールです。これはFirebugと少し似ており、ページの領域をクリックすると、ページのさまざまな部分に使用されるテーマ関数またはテンプレートファイルと、それらをオーバーライドするために使用できる「提案」を表示できます。

テンプレートは、さまざまな方法で組み合わせることができます。Drupalは、それらがどのようにネストされるかについていくつかの仮定を行います。これは、テンプレートファイルで使用可能なデフォルト変数に反映されます。ただし、テンプレートの提案とその中の使用可能な変数の両方を変更できます。

私が理解しているように、Drupal7ではpage.tpl.phpがhtml.tpl.phpに置き換えられました。

「ブロック」について私が聞いた最も良い説明は、さまざまなエリアのサイトで再利用されるコンテンツを表示するために使用するものであるということです。最も一般的な用途は、「最近更新されたページ」リストや「現在オンラインになっているユーザー」リストなどのサイドバーです。

于 2011-02-22T04:41:04.593 に答える
2

特に開始から5分後(05 :10)。申し訳ありませんが、ここでは詳細を指定できません。まだ自分で見ているからです。そしてそれも理解してみてください。;)

[アップデート]

ここでのプレゼンテーションを見た後、drupal7がどのようにページをレンダリングするかについての私の簡単な結論は次のとおりです。

あなたがあなたの質問から言及する一般的なアプローチの代わりに

ここで、トップレベルのレイアウト/ページPHPファイルは、基本的なドキュメント構造を設定し、インクルードまたはビューレンダリングメソッドを介してさまざまなサブビューをレンダリングします。

Drupalは、このようなレンダリングフローアプローチを使用してページをレンダリングします

  1. ブートストラップ
  2. menu_execute_active_handler
  3. page_callback
  4. delivery_callback
  5. hook_page_alter()
  6. drupal_render($ page)

ただし、テーマエンジン(これは正しい用語ですか?)がPHPのさまざまな部分をこのページに取り込む方法については詳しく説明します(批判ではなく、この本は私が行っている道とは異なるアプローチを取っています)。

さまざまな部分が、フロー番号3(page_callback)のレンダリングからフロー番号6(drupal_render($ page))まで提供され、drupalレンダリング可能な配列の配列を返し、テーマの後半で$pageを使用できます。変数(drupal_render($ page)から提供)、つまりdrupalコンテンツをレンダリングします。

于 2011-02-22T05:06:12.557 に答える